在我的计算机中,此代码需要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);
}

CIL
.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)!

最佳答案

rr该功能存在的唯一原因是要利用CPU指令,而他们甚至没有这样做!

07-24 13:54