乘法比.NET中的比较更快?

Mig*_*uel 4 .net c# performance

早上好,下午或晚上,

直到今天,我认为比较是基本的处理器指令之一,因此它是计算机中可以做的最快的操作之一...另一方面,我知道乘法有时比较棘手并涉及大量的位操作.但是,看到以下代码的结果我有点震惊:

Stopwatch Test = new Stopwatch();

int     a = 0;
int     i = 0, j = 0, l = 0;
double  c = 0, d = 0;

for (i = 0; i < 32; i++)
{
    Test.Start();

    for (j = Int32.MaxValue, l = 1; j != 0; j = -j + ((j < 0) ? -1 : 1), l = -l)
    {
        a = l * j;
    }

    Test.Stop();

    Console.WriteLine("Product: {0}", Test.Elapsed.TotalMilliseconds);
    c += Test.Elapsed.TotalMilliseconds;

    Test.Reset();
    Test.Start();

    for (j = Int32.MaxValue, l = 1; j != 0; j = -j + ((j < 0) ? -1 : 1), l = -l)
    {
        a = (j < 0) ? -j : j;
    }

    Test.Stop();

    Console.WriteLine("Comparison: {0}", Test.Elapsed.TotalMilliseconds);
    d += Test.Elapsed.TotalMilliseconds;

    Test.Reset();
    }

    Console.WriteLine("Product: {0}", c / 32);
    Console.WriteLine("Comparison: {0}", d / 32);
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

结果:

产品: 8558.6
比较: 9799.7

快速解释:j是一个辅助的替代变量,(...), 11, -10, 9, -8, 7, (...)直到它达到零,l是一个存储j符号的变量,并且a是测试变量,我希望它总是等于模数j.测试的目的是检查a使用乘法或条件运算符设置为此值是否更快.

有人可以对这些结果发表评论吗?

非常感谢你.

dig*_*All 5

你的第二次测试不仅仅是比较,而是if语句.

这可能是在一个JUMP/BRANCH指令中转换的CPU,涉及分支预测(可能有管道的块),然后可能比简单的乘法慢(即使不是那么多).