2012-08-01 31 views
8

我想知道語言是否有很大的性能差異,您是否應該在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 
+0

,在很大程度上依賴於編譯器,編譯器版本,您選擇的優化選項,有時只是天氣。但是,在我所能想到的所有實際案例中,99.999%很可能會注意到沒有區別。 – 2012-08-01 16:41:59

+0

在** NANOSECONDS的規模上會有性能差異!**除了超人以外,任何人都不會注意到這一點。 – Marlon 2012-08-01 16:48:46

回答

6

不想將它們放在使代碼更清楚,它通常具有更可能首先被執行的順序。

+2

完全支持這個答案。精心編寫代碼的良好組織會將此納入規則 – 2012-08-01 16:49:17

+0

我不同意。問題是關於表現。 – 2015-01-26 16:45:08

1

分支預測會引起其中的一個更可能,它會導致如果一個循環中的性能差異。但大多數情況下,如果您不是在彙編程序級別考慮,您可以忽略這一點。

3

除非您遇到性能問題,否則不要擔心。

如果您確實遇到性能問題,請嘗試切換它們,並使用度量值哪種變體更快(如果有的話)。

1

通常的規則是首先放置更可能的情況,它被認爲更具可讀性。

0

它大多不有所作爲,但有時更容易閱讀和調試,如果你的IFS正在檢查,如果事情是真的還是平等的,當情況不是這樣的其他處理。

0

正如其他人說,它不會產生巨大的變化,除非你使用這個很多很多次(例如循環)。在這種情況下,首先要儘可能提供最好的條件,因爲它最早有機會脫離條件檢查。

當你開始有很多「其他」時,它會變得更加明顯。

7

正如其他人說:在性能方面,你應該最好依靠你的編譯器和硬件(分支預測,推測執行)做正確的事。

如果您真的擔心這兩個對您的幫助不夠,GCC會提供一個builtin(__builtin_expect),您可以使用它明確指出分支的預期結果。

在代碼可讀性方面,我個人更喜歡更可能的情況。

+0

我投了這個答案,如果你解釋瞭如何使用__builtin_expect並給出了一個例子,那會更好。 – 2012-08-01 16:57:27

+0

只有當編譯器知道哪一個更可能時,當涉及到用戶輸入時,編程人員最清楚什麼是用戶將選擇的最可能的選項 – 2012-08-01 17:23:26

+0

__builtin_expect()的示例可以在鏈接的文檔中找到至。 – BjoernD 2012-08-01 21:04:53

0

可能出現的任何差異是更相關的比固有地if-else結構的上下文。所以你可以在這裏做的最好的是開發你自己的測試來檢測任何差異。

除非你正在優化一個已經完成的系統或軟件,否則我建議你是避免過早優化。可能你已經聽說他們是邪惡的。

0

據我所知有現代化的優化C編譯器有你如何組織在生成的代碼if或環和實際分支指令之間沒有直接關係。而且不同的CPU有不同的分支預測算法。

因此:

  • 不要優化,直到你看到與此相關的代碼

  • 如果優化,衡量和比較不同版本

  • 使用真實的數據表現不佳性能測量的各種特性

  • 看看彙編代碼生成d在你的編譯器中都是這樣。

0

這不一定是一個性能問題,但我通常從特殊到一般去防止類似案例:

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"); 

現在上面的代碼將被更多的一般條件

0

所有答案都正確的觀點得到停止之前達到「fizzbuzz」。這是一個額外的一個:

  • 避免雙重否定:如果這一點,那麼,別的東西往往是爲讀者混淆。因此,對於給出的例子,我贊成:

    if (somespecific_keycode) { 
        do_the_specific_stuff(); 
    } else { 
        do_general_stuff(); 
    } 
    
相關問題