.net - 为什么 Math.DivRem 如此低效?

标签 .net optimization

在我的电脑中,这段代码需要 17 秒(10 亿次):

static void Main(string[] args) {
   var sw = new Stopwatch(); sw.Start();
   int r;
   for (int i = 1; i <= 100000000; i++) {
      for (int j = 1; j <= 10; j++) {
         MyDivRem (i,j, out r);
      }
   }
   Console.WriteLine(sw.ElapsedMilliseconds);
}

static int MyDivRem(int dividend, int divisor, out int remainder) {
   int quotient = dividend / divisor;
   remainder = dividend - divisor * quotient;
   return quotient;
}

而 Math.DivRem 需要 27 秒。

.NET Reflector给我这个 Math.DivRem 代码:
public static int DivRem(int a, int b, out int result)
{
    result = a % b;
    return (a / b);
}

国际劳工组织
.method public hidebysig static int32 DivRem(int32 a, int32 b, [out] int32& result) cil managed
{
    .maxstack 8
    L_0000: ldarg.2
    L_0001: ldarg.0
    L_0002: ldarg.1
    L_0003: rem
    L_0004: stind.i4
    L_0005: ldarg.0
    L_0006: ldarg.1
    L_0007: div
    L_0008: ret
}

理论上多核的计算机可能会更快,但实际上它首先不需要做两个操作,因为 x86 CPU 返回 商和余数 当他们使用 DIV 或 IDIV ( http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_6/CH06-2.html#HEADING2-451 ) 进行整数除法时!

最佳答案

咕噜噜。这个功能存在的唯一原因就是利用CPU指令来做这个,他们甚至没有这样做!

关于.net - 为什么 Math.DivRem 如此低效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/447282/

相关文章:

c# - 在 C# 中使用结构的单例

c# - 通过 Silverlight 4.0 的 VOIP 功能(最多 5 个用户的实时语音流)?

c# - 具有多线程的 OracleBulkCopy

optimization - 自动化网络部署

algorithm - 寻找有关理解特定组合优化问题的建议

python - scipy.optimize()值错误:Shape mismatch for sum

mysql - 优化MySQL单表SQL查询

c# - 将文件上传到 Amazon S3 中的存储桶失败并显示 "Maximum number of retry attempts reached"

c# - 每n秒唤醒一次线程

php - 微优化值得花时间吗?