簡體   English   中英

如果和否則,我應該把更有可能的部分放在里面嗎?

[英]If and else, were should I put the more likely part?

我想知道語言是否存在很大的性能差異,您是否應該將更有可能被執行的代碼放在ifelse子句中。 下面是一個例子:

// 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 == 0i % 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM