[英]In the C if-else statement, should the condition which is more likely to be true come first?
[英]If and else, were should I put the more likely part?
我想知道語言是否存在很大的性能差異,您是否應該將更有可能被執行的代碼放在if
或else
子句中。 下面是一個例子:
// x is a random number, or some key code from the user
if(!somespecific_keycode)
do the general stuff
else
do specific stuff
和另一個解決方案
if(somespecific_keycode)
do the specific stuff
else
do general stuff
更喜歡將它們按使代碼更清晰的順序排列,這通常更有可能首先執行。
正如其他人所說:就性能而言,您最好依靠編譯器和硬件(分支預測、推測執行)來做正確的事情。
如果您真的擔心這兩個對您的幫助不夠,GCC 提供了一個內置函數 (__builtin_expect),您可以使用它來明確指示分支的預期結果。
在代碼可讀性方面,我個人更喜歡最有可能的情況。
除非您遇到性能問題,否則不要擔心。
如果您確實遇到了性能問題,請嘗試切換它們並測量哪個變體更快(如果有的話)。
分支預測將導致其中一個更有可能發生,並且如果在循環內,它將導致性能差異。 但大多數情況下,如果您不是在匯編級別思考,您可以忽略它。
通用規則是將更可能的情況放在首位,它被認為更具可讀性。
這不一定是性能問題,但我通常會從特定到一般來防止這樣的情況:
int i = 15;
if(i % 3 == 0)
System.out.println("fizz");
else if(i % 5 == 0)
System.out.println("buzz");
else if(i % 3 == 0 && i % 5 == 0)
System.out.println("fizzbuzz");
上面的代碼永遠不會說 'fizzbuzz',因為 15 匹配i % 3 == 0
和i % 5 == 0
條件。 如果您重新訂購更具體的東西:
int i = 15;
if(i % 3 == 0 && i % 5 == 0)
System.out.println("fizzbuzz");
else if(i % 3 == 0)
System.out.println("fizz");
else if(i % 5 == 0)
System.out.println("buzz");
現在上面的代碼將在被更一般的條件停止之前達到“fizzbuzz”
所有答案都有有效點。 這是一個額外的:
避免雙重否定:如果不是這個,那么那個,否則有些東西往往會讓讀者感到困惑。 因此,對於給出的例子,我贊成:
if (somespecific_keycode) { do_the_specific_stuff(); } else { do_general_stuff(); }
它通常沒有什么區別,但有時如果您的 if 正在檢查某事是否為真或相等,並且 else 處理情況並非如此,則有時更容易閱讀和調試。
正如其他人所說,除非您多次使用它(例如在循環中),否則它不會產生巨大的差異。 在這種情況下,將最有可能的條件放在首位,因為它將有最早的機會突破條件檢查。
當你開始有很多 'else if' 時,它變得更加明顯。
可能出現的任何差異都與上下文相關,而不是與if-else
結構的內在差異。 因此,您在這里可以做的最好的事情就是開發自己的測試來檢測任何差異。
除非您正在優化已經完成的系統或軟件,否則我建議您避免過早優化。 可能你已經聽說過他們是邪惡的。
AFAIK 使用現代優化 C 編譯器,在您組織if
或循環的方式與生成代碼中的實際分支指令之間沒有直接關系。 此外,不同的 CPU 具有不同的分支預測算法。
所以:
在您看到與此代碼相關的不良性能之前不要進行優化
如果你做優化,衡量和比較不同的版本
使用不同特性的真實數據進行性能測量
在這兩種情況下查看編譯器生成的匯編代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.