我有一些代码对64位整数进行了大量的比较,但是它必须考虑数字的长度,就好像它被格式化为字符串一样。我不能更改调用代码,只能更改函数。
最简单的方法(除了.ToString().Length)是:
(int)Math.Truncate(Math.Log10(x)) + 1;
然而,这表现得相当糟糕。因为我的应用程序只发送正值,并且长度在2和9之间相当均匀地分布(偏向于9),所以我预先计算了这些值和have if语句:
static int getLen(long x) {
if (x < 1000000) {
if (x < 100) return 2;
if (x < 1000) return 3;
if (x < 10000) return 4;
if (x < 100000) return 5;
return 6;
} else {
if (x < 10000000) return 7;
if (x < 100000000) return 8;
if (x < 1000000000) return 9;
return (int)Math.Truncate(Math.Log10(x)) + 1; // Very uncommon
}
}
这样就可以通过平均4次比较来计算长度。
那么,有没有其他技巧可以让这个函数更快呢?
编辑:这将作为32位代码(Silverlight)运行。
更新:
我采纳了诺曼的建议,对in做了一些修改,平均只有3次比较。根据Sean的评论,我删除了Math.Truncate。总而言之,这提高了大约10%。谢谢!
https://stackoverflow.com/questions/679602
复制相似问题