什麼是從一個代碼執行的角度更快:最佳的方式在C#來否定一個浮點值
double a = 1.234;
double minus_a = -a;
或:
double a = 1.234;
double minus_a = a * -1;
是否第二種情況下實際執行浮點乘法?還是編譯器足夠聰明,可以優化第二種情況與第一種情況相同?
什麼是從一個代碼執行的角度更快:最佳的方式在C#來否定一個浮點值
double a = 1.234;
double minus_a = -a;
或:
double a = 1.234;
double minus_a = a * -1;
是否第二種情況下實際執行浮點乘法?還是編譯器足夠聰明,可以優化第二種情況與第一種情況相同?
測試與.NET 4,其他即時編譯器的64位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的符號,但這並不重要。
沒有理由假設第一個會比第二個慢,而且它更短,更傳統。爲什麼你會考慮第二個? –
您是否知道您可以[查看已編譯的IL](https://msdn.microsoft.com/zh-cn/library/f7dy01k1(v = vs.110).aspx)並自行找出答案? –
否定一個值比乘法更簡單和可讀! –