2012-12-30 25 views
12

可能重複:
What is the relative performance difference of if/else versus switch statement in Java?爲什麼單個「if」比「switch」慢?

考慮以下兩種方法:

public static int useSwitch(int i) { 
    switch (i) { 
    case 0: 
     return 1; 
    default: 
     return 0; 
    } 
} 

public static int useIf(int i) { 
    if (i == 0) 
     return 1; 
    return 0; 
} 

測試顯示,switch稍快執行(每次通話1.4納秒我的機器上)比if版本。

我一直認爲,一個交換機的利益並沒有踢,直到至少有幾個ifs可以避免的,

爲什麼switch比單if快?

+4

你知道他們是如何編譯的嗎?也許你可以在那裏找到你的答案。 – user1306322

+2

@ user1306322-您必須更深入地研究JVM如何解釋或編譯該字節碼。第一個代碼可能會使用'lookupswitch'或'tableswitch'指令,而第二個代碼將使用正常的跳轉。所有這些都取決於JVM如何讓它們快速運行。 – templatetypedef

+3

你可以發佈你的基準代碼嗎? –

回答

7

通過檢查字節碼是否如預期的結果:

SWITCH

public static useSwitch(I)I 
L0 
    ILOAD 0 
    TABLESWITCH 
    0: L1 
    default: L2 
L1 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L2 
    INVOKESTATIC Tests.b()I 
    IRETURN 

IF

public static useIf(I)I 
L0 
    ILOAD 0 
    IFNE L1 
L2 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L1 
    INVOKESTATIC Tests.b()I 
    IRETURN 

現在我沒有看到哪一個什麼特別的原因應該比另一個慢(在任何情況下都不是一個有意義的數額)。這肯定是與特定的JVM實現以及它如何執行這些操作碼有關的東西。根據常識,TABLESWITCH指令應該較慢,除非有足夠的情況使其構建有價值,但這只是常見思維。每個JVM都可以以不同的方式實現,所以這只是猜測。

您確定要以一致的方式對所有內容進行分析嗎? (通過給JVM預熱時間,將結果保持在置信範圍內以及使分析足夠正確的所有其他事情可用)

+0

我必須承認,多次運行測試後,*有時*如果比開關快。您對此的評論沒有任何特定的差異原因反映了我在進一步測試中發現的內容 – Bohemian