大多數語言都使用短路和/或運營商。例如,短路和性能
return foo() && bar();
如果foo()返回false,將永遠不會調用bar()。如果我們知道表達式的結果將是錯誤的,則不需要調用bar()。
爲了使代碼更快運行,最初實現此行爲的原因。然而,從那時起技術發生了變化。相對於其他操作而言,特別是分支更昂貴,那麼當引入短路時將是這種情況。
所以我想知道:它仍然是短路電路運營商的性能增益?
大多數語言都使用短路和/或運營商。例如,短路和性能
return foo() && bar();
如果foo()返回false,將永遠不會調用bar()。如果我們知道表達式的結果將是錯誤的,則不需要調用bar()。
爲了使代碼更快運行,最初實現此行爲的原因。然而,從那時起技術發生了變化。相對於其他操作而言,特別是分支更昂貴,那麼當引入短路時將是這種情況。
所以我想知道:它仍然是短路電路運營商的性能增益?
是的。
想想看,如果你想要做這樣的事情是什麼:
return IsOKToStart() && CalculateFirstPrimeGreaterThanTrilion();
第一個是一個簡單的測試,其他仍然需要幾個月的時間來計算。
答案應該是「也許」。
查看this blog by Eric Lippert關於C#編譯器進行的某些低級優化。
他認爲,至少,評估一個簡單的布爾表達式的短路是一種更加昂貴的方法,只是評估整個事情。下面是相關的摘錄:
一個簡短的題外話:不應該說是temp1.HasValue & & temp2.HasValue?兩個版本都給出了相同的結果;短路效率更高嗎?不必要!將兩個bools結合在一起非常快,可能比做額外的條件分支更快,以避免將會非常快速的查找屬性。代碼當然更小。 Roslyn使用非短路AND,我似乎回想起早期的編譯器也是如此。
顯然有些情況下,它的幫助。我想知道的是它是否通常有幫助。我不得不懷疑,這個分支通常比我們正在避免的更昂貴。 –
該分公司並不昂貴。當你考慮它時,程序無論如何都會一次計算出一個條件。在每個條件之後只有一個額外的小布爾檢查,以查看是否可以分支。沒有任何成本,並且比調用函數少得多。 –
但條件分支很昂貴:http://stackoverflow.com/questions/315306/is-if-expensive –