繁体   English   中英

为什么C#arithmetic on double似乎比long算术快?

[英]Why C# arithmetic on double appears to be faster than arithmetic on long?

以下代码的令人惊讶的输出显示double上的算术比long更快100%:

Test_DivOperator Float算术测量时间:15974.5024 ms。

Test_DivOperator整数算术测量时间:28548.183 ms。

使用的构建设置是.Net4.5 C#5.0(平台目标:x64)

使用的硬件是Intel Core i5-2520M(运行Windows7 64Bit)

注意:使用的运算符(此处为除法)确实会影响结果,除法最大化此观察结果

const int numOfIterations = 1; //this value takes memory access out of the game
const int numOfRepetitions = 500000000; //CPU bound application
Random rand = new Random();
double[] Operand1 = new double[numOfIterations];
double[] Operand2 = new double[numOfIterations];
double[] Operand3 = new double[numOfIterations];

long[] Int64Operand1 = new long[numOfIterations];
long[] Int64Operand2 = new long[numOfIterations];
long[] Int64Operand3 = new long[numOfIterations];

for (int i = 0; i < numOfIterations; i++)
{
    Operand1[i]=(rand.NextDouble() * 100);
    Operand2[i]=(rand.NextDouble() * 80);
    Operand3[i]=(rand.NextDouble() * 17);
    Int64Operand1[i] = (long)Operand1[i];
    Int64Operand2[i] = (long)Operand2[i]+1;
    Int64Operand3[i] = (long)Operand3[i]+1;
}

double[] StdResult = new double[numOfIterations];
long[] NewResult = new long[numOfIterations];

TimeSpan begin = Process.GetCurrentProcess().TotalProcessorTime;

for (int j = 0; j < numOfRepetitions; j++)
{
    for (int i = 0; i < numOfIterations; i++)
    {
        double result = Operand1[i] / Operand2[i];
        result = result / Operand3[i];
        StdResult[i]=(result);
    }

}

TimeSpan end = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine("Test_DivOperator Float arithmetic measured time: " + (end - begin).TotalMilliseconds + " ms.");

begin = Process.GetCurrentProcess().TotalProcessorTime;

for (int j = 0; j < numOfRepetitions; j++)
{
    for (int i = 0; i < numOfIterations; i++)
    {
        long result =    Int64Operand1[i] / Int64Operand2[i];
        result = result / Int64Operand3[i];
        NewResult[i]=(result);
    }

}

end = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine("Test_DivOperator Integer arithmetic measured time: " + (end - begin).TotalMilliseconds + " ms.");

这并不意外。 64位整数除法就是那么慢。

您的处理器是Sandy Bridge,查看延迟和吞吐量 ,64位idiv具有更高的延迟和比divsd更差的吞吐量。

其他微体系结构显示出类似的差异。

做实际的数学运算,每次迭代2.8548183E10ns / 500000000 = 57ns,频率为3.2GHz,大约183个周期,有两个分区和一些额外的开销,所以这并不奇怪。

对于双打,它可以达到32ns,102个周期,实际上比我预期的要多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM