2017-05-30 62 views
1

什麼是從一個代碼執行的角度更快:最佳的方式在C#來否定一個浮點值

double a = 1.234; 
double minus_a = -a; 

或:

double a = 1.234; 
double minus_a = a * -1; 

是否第二種情況下實際執行浮點乘法?還是編譯器足夠聰明,可以優化第二種情況與第一種情況相同?

+0

沒有理由假設第一個會比第二個慢,而且它更短,更傳統。爲什麼你會考慮第二個? –

+0

您是否知道您可以[查看已編譯的IL](https://msdn.microsoft.com/zh-cn/library/f7dy01k1(v = vs.110).aspx)並自行找出答案? –

+0

否定一個值比乘法更簡單和可讀! –

回答

4

測試與.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的符號,但這並不重要。

+0

太棒了。正是我想要的:「* -1」調用浮點乘法!這裏沒有優化。 – Arvind

+0

我的確寫了一個簡單的基準。結果:經過的時間爲00:00:02.6422642 --- * -1經過時間00:00:03.4353435 --------所以浮點乘法運算速度減慢了30%左右。 – Arvind