c# - 计算整数十进制长度的最快方法? (。网)

标签 c# .net performance integer

我有一些代码可以对 64 位整数进行大量比较,但是它必须考虑数字的长度,就好像它被格式化为字符串一样。我无法更改调用代码,只能更改函数。

最简单的方法(除了 .ToString().Length 之外)是:

(int)Math.Truncate(Math.Log10(x)) + 1;

然而,这表现相当糟糕。由于我的应用程序只发送正值,并且长度在 2 和 9 之间相当均匀地分布(有些偏向 9),我预先计算了这些值并有 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) 运行。

更新:

我采纳了 Norman 的建议并稍微更改了 ifs 以导致平均只有 3 次比较。根据 Sean 的评论,我删除了 Math.Truncate。总之,这使事情增加了大约 10%。谢谢!

最佳答案

两个建议:

  1. 先介绍常见案例。
  2. 进行二分搜索以在最坏情况下尽量减少比较次数。您可以使用恰好 3 次比较在 8 个备选方案中做出决定。

除非分布非常偏斜,否则这种组合可能不会给你带来太多好处。

关于c# - 计算整数十进制长度的最快方法? (。网),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679602/

相关文章:

.net - 模型存储 edmx 文件不会在 Debug模式下生成,但会在 Release模式下生成

sql - SQL 查询复杂性与性能之间是否有任何一般规则?

sql - ORDER BY 条件

c - Eventloop 具有高 ksoftirqd 负载; nginx 不会,但会执行相同的系统调用。为什么?

c# - Selenium C# : How to pull value from input element

c# - 获得文件或文件夹的所有权

.net - 如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?

c# - asp :button click 上的 ASP.NET 异步回发

c# - DateTime.ToString 格式表达式是否受当前区域性影响?

c# - DirectoryInfo.GetFiles() 不返回桌面上的所有文件(不包括快捷方式)