对于它的价值,使用 SSE 指令几乎与使用常数一样快mulsd
(通过公平掷骰子选择,保证是随机的)。NaN
4.0
这段代码:
for (unsigned i = 0; i < 2000000000; i++)
{
double j = doubleValue * i;
}
用clang生成这个机器代码(在循环内)(我假设.NET虚拟机也可以使用SSE指令):
movsd -16(%rbp), %xmm0 ; gets the constant (NaN or 4.0) into xmm0
movl -20(%rbp), %eax ; puts i into a register
cvtsi2sdq %rax, %xmm1 ; converts i to a double and puts it in xmm1
mulsd %xmm0, %xmm1 ; multiplies xmm0 (the constant) with xmm1 (i)
movsd %xmm1, -32(%rbp) ; puts the result somewhere on the stack
经过 20 亿次迭代,NaN
(由 C 宏定义)版本NAN
在我的 i7 上执行的时间减少<math.h>
了大约 0.017秒。差异可能是由任务调度程序引起的。
所以公平地说,它们的速度完全一样。