2010-08-02 72 views
9

可能重複:
Is "else if" faster than "switch() case"?
What is the relative performance difference of if/else versus switch statement in Java?case語句或if語句效率的角度

我知道,case語句可以跳轉表來實現。這是否使它們比語句更有效率?

這是應該避免的微型優化嗎?

+2

杜佩的[是「否則,如果」不是「切換更快速()情況「?](http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case),[Java中的if/else與switch語句的相對性能差異是什麼?]( http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in),[If vs. Switch Speed](http:///stackoverflow.com/questions/445067/if-vs-switch-speed)等。 – BalusC 2010-08-02 13:05:48

+0

這不是一個dup,因爲這個問題是java特定的。 – sixtyfootersdude 2010-08-02 13:09:14

+1

其實你是對的。這是http://stackoverflow.com/questions/2086529/what-is-the-relative-performance-difference-of-if-else-versus-switch-statement-in的副本。這不是別人的重複,因爲它們不是java特有的。討厭效率和性能如何不同的標籤。 – sixtyfootersdude 2010-08-02 13:13:02

回答

35

我認爲最主要的是儘可能清晰地編寫代碼。像這樣的微觀優化不應該成爲焦點。

舉例來說,如果你有這樣的事情:

if (age == 10) { 
    // ... 
} else if (age == 20) { 
    // ... 
} else if (age == 30) { 
    // ... 
} else if (age == 40) { 
    // ... 
} 

然後它更清晰使用switch語句:

switch (age) { 
    case 10: 
     // ... 
     break; 
    case 20: 
     // ... 
     break; 
    case 30: 
     // ... 
     break; 
    case 40: 
     // ... 
     break; 
} 

同樣,我將專注於使該代碼最容易閱讀和維護,而不是納秒級的效率提升。

0
  1. 不,這是你的程序設計的一部分。但是,你應該考慮一種可以超越的方法是否可能不是一個更好的解決方案,而且是一個類型族。
2

如果你有一個很大 if if else語句的鏈,那麼,是的,你可能會感覺到不同。但是你會寫出如此長的連鎖鏈是非常不現實的。如果即使你做了,仍然不太可能出現性能瓶頸。

將您的代碼編寫爲首先可讀,並在性能優化需求出現時讓您自己接受分析器的指導。

3

如果可以驗證這些值合理緊湊,任何編譯器都會創建跳轉表。 (我懷疑他們是否在這種情況下,是10的倍數。)

這是一個微型優化。微型優化只有在你知道的情況下才有意義。通常情況下,其他地方有更大的「魚苗」,以函數調用的形式存在,可以不用。但是,如果您已經從代碼中調整了日光,並且您的配置文件顯示,這些IF語句(而不是其內容)中有一小部分時間(如10%或更多)會有幫助。例如,這可能發生在字節碼解釋器中。

添加:我喜歡使用switch的另一個原因是,即使它沒有創建跳轉表 - 在調試器中單步執行代碼時,它會直接轉到正確的情況,而不是讓我一步步完成很多虛假的if聲明。使其更易於調試。

1

可能不重要。字節碼只是JVM的一種「傳輸格式」。 JVM與字節碼錶示有很大區別。(例如:字節碼不提供浮動操作,所以float + - * /%float是作爲雙重操作完成的,然後結果返回浮動狀態。對於字節/短整數也是如此,它們被轉換爲int,然後返回)但是對於開關它們是兩個字節碼格式,其中一個已經有一個跳轉表。但說實話:我會選擇一種最適合你和你的節目的讀者的格式。 JVM將完成剩下的工作。如果你太聰明,你的JVM可能不明白你的觀點,最後程序會變慢。

「我們應該忘記小的效率,講的時候約97%:過早的優化是萬惡之根」 D.克努特