2011-08-11 17 views
1

大多數語言都使用短路和/或運營商。例如,短路和性能

return foo() && bar(); 

如果foo()返回false,將永遠不會調用bar()。如果我們知道表達式的結果將是錯誤的,則不需要調用bar()。

爲了使代碼更快運行,最初實現此行爲的原因。然而,從那時起技術發生了變化。相對於其他操作而言,特別是分支更昂貴,那麼當引入短路時將是這種情況。

所以我想知道:它仍然是短路電路運營商的性能增益?

回答

1

是的。

想想看,如果你想要做這樣的事情是什麼:

return IsOKToStart() && CalculateFirstPrimeGreaterThanTrilion(); 

第一個是一個簡單的測試,其他仍然需要幾個月的時間來計算。

+0

顯然有些情況下,它的幫助。我想知道的是它是否通常有幫助。我不得不懷疑,這個分支通常比我們正在避免的更昂貴。 –

+0

該分公司並不昂貴。當你考慮它時,程序無論如何都會一次計算出一個條件。在每個條件之後只有一個額外的小布爾檢查,以查看是否可以分支。沒有任何成本,並且比調用函數少得多。 –

+0

但條件分支很昂貴:http://stackoverflow.com/questions/315306/is-if-expensive –

1

答案應該是「也許」。

查看this blog by Eric Lippert關於C#編譯器進行的某些低級優化。

他認爲,至少,評估一個簡單的布爾表達式的短路是一種更加昂貴的方法,只是評估整個事情。下面是相關的摘錄:

一個簡短的題外話:不應該說是temp1.HasValue & & temp2.​​HasValue?兩個版本都給出了相同的結果;短路效率更高嗎?不必要!將兩個bools結合在一起非常快,可能比做額外的條件分支更快,以避免將會非常快速的查找屬性。代碼當然更小。 Roslyn使用非短路AND,我似乎回想起早期的編譯器也是如此。