2009-07-24 19 views
0

如果/ if if語句中的每個塊返回,還是最好有一個ifs鏈?具體而言,這要是最快:在C中,這是更快:如果有回報,或者如果有回報?

答:

if (condition1) { 
    code1; 
    return a; 
} 
if (condition2) { 
    code2; 
    return b; 
} 
//etc... 

B:

if (condition1) { 
    code1; 
    return a; 
} 
else if (condition2) { 
    code2; 
    return b; 
} 
//etc... 
+0

我會假設*前者更快,但可能會更好地使用第二個,因爲它更清楚地表明第二個if塊將不會被執行,除非第一個條件失敗。 – mpen 2009-07-24 02:44:32

+7

不,C不會規定CPU級別發生了什麼。沒有JMP語句的CPU體系結構似乎是合理的,它使用一個標誌來執行語句,但會丟棄結果。這意味着速度是相同的。我的觀點是:你不能假設C代碼將會成爲封面。 – paxdiablo 2009-07-24 02:48:06

+2

「架構...它使用一個標誌來執行語句,但放棄結果」。例如,ARM有條件指令,如果條件標誌被設置則執行條件指令,如果不是,則作爲nops。它們是由編譯器發出的,如果跳轉的速度比跳過的許多操作都要慢。 – 2009-07-24 02:54:05

回答

43

這沒有什麼區別,這是在微優化不必要的嘗試。

0

這應該在優化版本中執行相同的操作。如果不是,那麼別的東西可能會阻止編譯器做「正確的事情」。

Robbotic不正確。在這兩種情況下,如果第一個子句爲真,則子語句不會被執行(評估)。

請注意,一定要測量 - 你可能會優化錯誤的東西。

14

C標準確實是而不是指示根據C代碼創建什麼機器語言。如果你瞭解底層架構,你有時可以做出假設,但即使這樣也是不明智的。

時間已經過去了,現在CPU已經變成了簡單的動物,現在它們具有流水線,多級緩存以及各種其他奇妙的東西來推動它們的速度達到極限。

除非您遇到特定問題(有些人會說「完全」),否則不應該擔心這種優化級別。

寫你的代碼是可讀的

這應該是規則編號1,2和3.您認爲哪一個是軟件開發中最大的問題,代碼運行速度是其最大速度的99.5%,或者開發人員花費數天的時間試圖弄清楚和/同事(甚至他們自己)在六個月前做過?

我的建議是擔心性能只有當你發現這是一個問題,那麼基準目標平臺上看到最大的改進可以得到。通過在代碼中的其他地方選擇更好的算法(其他事情,例如代碼被調用的次數,當然是相等的),在if聲明中提高1%可能會變得相形見絀。優化應始終針對性以獲得最佳的每次降壓。

3

有了這些回報,其他的就是超級。編譯器可能很聰明,可以解決這個問題。

我懷疑編譯器會爲兩者生成相同的代碼。拆開它看看。

在任何情況下,檢查編譯器的輸出和經驗性能測試是唯一確定的方法。

2

它們應該在大多數體系結構上相當。生成的指令可能仍然是相同的bne,cmps和rets。

如果您使用switch/case而不是if語句,可能會有所幫助。

2

我真的不認爲這是一個很大的區別,如果任何:

對於一個案例:

if (condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toEndIf 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 
if(condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toEndIf 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 

對於B的情況:

if(condition){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :toElse + 1 
    code; 
    return bar; 
    //mov eax , bar 
    //jmp :toEnd 
} else 
    //jmp :endElse 
if (condition2){ 
    //conditionOp 
    //cmp ... , ... 
    //jxx :endElse 
    code; 
    return bar; 
    //mov eax, bar 
    //jmp :toEnd 
} 

因而,在使用B的情況下,增加一個額外的指令。雖然,優化大小可能會擺脫這一點。

1

寫一個簡單的測試程序來衡量這一點,並找出 - 但是這是不必要的優化。

相關問題