从代码执行的角度来看,更快的是:
double a = 1.234;
double minus_a = -a;
或:
double a = 1.234;
double minus_a = a * -1;
第二种情况是否实际执行浮点乘法?或者编译器是否足够智能以优化第二种情况与第一种情况相同?
答案 0 :(得分:4)
使用.NET 4的64位JIT进行测试,其他JIT(例如旧的32位JIT或更新的RyuJIT)可能不同(实际上32位旧的JIT 必须做其他事情,因为它不使用SSE)
-x
转换为
vmovsd xmm1,qword ptr [00000050h] ; there's a -0.0 there, so only the sign bit is set
vxorpd xmm0,xmm0,xmm1 ; literally flip the sign
x * -1
进入
vmulsd xmm0,xmm0,mmword ptr [00000048h] ; -1.0
是的,非常字面意义。
至于速度,您可以从here中选择您的模型并进行比较,但vxorpd
总是会比vmulsd
更快。
它是否已将x * -1
优化为异或? NaN的行为是不同的,XOR方法会翻转NaN的符号,但这并不重要。