2010-01-28 47 views
52

可能重複:
is 「else if」 faster than 「switch() case」 ?
What is the relative performance of if/else vs. switch in Java?病例vs如果其他如果:哪個更有效?

我一直編碼合的運行再次....當通過一個case語句調試步驟就跳轉到項目即時匹配條件,但是當使用if/else指定相同的邏輯時,它會遍歷每條if語句,直到找到勝者。案例陳述更有效率,還是我的調試器只是優化步驟? (不要擔心語法/錯誤,我在SO中輸入了這些信息,不知道它是否會編譯,它的原理是我之後,我不想將它們作爲整數,因爲我隱約記得有關case使用帶ints的偏移量)我使用C#,但是我對跨編程語言的一般答案感興趣。

switch(myObject.GetType()){ 

    case typeof(Car): 
     //do something 
     break; 

    case typeof(Bike): 
     //do something 
     break; 

    case typeof(Unicycle): 
     //do something 
     break; 

    case default: 
     break; 
} 

VS

Type myType = myObject.GetType(); 

    if (myType == typeof(Car)){ 
      //do something 
    } 

    else if (myType == typeof(Bike)){ 
      //do something 
    } 

    else if (myType == typeof(Unicycle)){ 
      //do something 
    } 
    else{ 

    } 
+8

這甚至不接近語言不可知論,任何答案都會緊密地綁定到一種特定的語言。 – skaffman 2010-01-28 23:25:09

+3

更不用說具體的編譯器和編譯器版本了。 – 2010-01-28 23:27:47

+0

它可能因語言,編譯器和運行時間而異。沒辦法知道肯定。 – FrustratedWithFormsDesigner 2010-01-28 23:29:22

回答

69

看來,編譯器在優化switch語句比if語句更好。

編譯器不知道評估if語句的順序對您是否重要,並且無法在其中執行任何優化。你可以在if語句中調用方法,影響變量。通過switch語句,它知道所有子句可以同時進行評估,並且可以以最有效的順序放置它們。

這裏有一個小的比較:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

+1

我不明白這部分 「你可能會在if語句中調用方法,影響變量」 這是怎麼發生的?我認爲這是一樣的。 – Castelmager 2016-09-12 13:48:58

+0

你可以這樣做(++ i){....},但你不能在switch case語句中這樣做。 – Granada 2016-12-09 16:09:39

0

我認爲這只是使得它簡單的調試器。 請注意,一個案件和「如果列表」並不完全相同。有一個原因,通常案件阻止結束與「休息」。在裝配中分解時,case stmt實際上看起來像這樣。

if myObject.GetType() == type of Car 
    GOTO START_CAR 
else if myObject.GetType() == type of Bike 
    GOTO START_BIKE 

LABEL START_CAR 
//do something car  
GOTO END 

LABEL START_BIKE 
//do something bike 
GOTO END 

LABEL END 

如果你沒有突破,那麼情況塊是缺少「GOTO END」撐條,而事實上,如果你在「車」的情況下登陸你實際運行兩部分

//do something car  
//do something bike 
GOTO END 
0

我相信,因爲case必須是常量值,switch語句與goto等價,所以根據變量的值跳轉到正確的case,而在if/then語句中它必須評估每個表情。

7

的調試器使其更簡單,因爲你不想步,編譯器生成的實際代碼。

如果交換機包含五個以上的項目,則使用查找表或散列表實現,否則使用if..else實施。

查看密切相關的問題is 「else if」 faster than 「switch() case」 ?

除C#之外的其他語言當然會以不同的方式實現它,但交換機通常更高效。

5

許多編程語言都對switch語句進行了優化,以便它比標準的if-else if結構快得多,只要這些結構是編譯器常量。許多語言使用跳轉表或索引branch table來優化開關語句。 Wikipedia對switch語句有很好的討論。此外,here是關於C中開關優化的討論。

有一點需要注意的是,switch語句可能會被濫用,並且根據具體情況,最好使用多態而不是switch語句。例如,請參閱here

0

維基百科的Switch statement entry是相當大,其實很不錯。有趣的點:

  • 交換機本身並不快。它取決於語言,編譯器和特定用途。
  • 編譯器可能使用跳轉表或索引函數指針優化開關。
  • 該聲明受到Stephen Kleene(及其他人)的一些有趣數學的啓發。

對於使用C開關的奇怪和有趣的優化,請參閱Duff's Device