2013-12-12 48 views
3

我有兩個簡單的代碼片段以下.nippet 1沒有其他condition.Logically這兩個片段服務於相同的目的。if-else優化和陷阱?

我想知道是否有任何疑難解答或任何優化改進,如果我要在我的程序中的兩個片段之間進行選擇?

片段1

public boolean isOauthTokenValid(long oauthExpiryTimestamp){ 

    if (oauthExpiryTimestamp >= System.currentTimeMillis()){ 
     return true; 
    } 

    return false; 
} 

片段2

public boolean isOauthTokenValid(long oauthExpiryTimestamp){ 

    if (oauthExpiryTimestamp >= System.currentTimeMillis()){ 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

請問這給在字節碼級優化?

+0

它會給字節碼級別的任何性能改進?或者只是增加可讀性 – cherit

+1

'如果(...)返回true否則返回false;'沒有任何意義。只要'返回...;'。 –

+0

請注意不成熟的優化 - – KevinDTimm

回答

16

完全免除if。您可以直接使用比較的結果:

return (oauthExpiryTimestamp >= System.currentTimeMillis()); 
+4

謝謝!當談到編程風格時,不使用這個習慣用語是我最大的寵兒之一。 – ApproachingDarknessFish

3

更簡單:

return oauthExpiryTimestamp >= System.currentTimeMillis(); 

通過這種方式,你可以不用使用條件在你的代碼。但無論如何,性能增益可以忽略不計。

爲什麼這有效?因爲如果條件中的布爾表達式爲true,那麼您將返回true,如果它是false,則返回false - 因此它足以返回布爾表達式的值。

+0

這將導致與使用if-else相同的字節碼? – cherit

+1

@TitoCheriachan「也許」。它依賴於靜態編譯器,無論如何,JIT編譯器可能會在運行時將其優化爲相同的代碼。這裏重要的是這兩個版本在語義上是等價的,並且使用任何一個版本獲得的性能差異可以忽略不計。編寫易於閱讀的代碼更重要,而不必擔心如此微小的微型優化 –

0

一個好的編譯器會產生相同的字節碼。

在這種情況下,您應該以可讀性爲導向(請參閱關於全部刪除條件的其他解答)。

2

回答這個問題本身,兩個給定的片段被編譯爲相同的字節碼,但與@rgettman和ÓscarLópez建議的簡潔版本不同。

private final Random r = ThreadLocalRandom.current(); 

private boolean test() { 
    return r.nextBoolean(); 
} 

boolean full() { 
    if (test()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

boolean part() { 
    if (test()) { 
     return true; 
    } 
    return false; 
} 

boolean id() { 
    return test(); 
} 

結果:

 boolean full(); 
     Code: 
     0: aload_0 
     1: invokespecial #2     // Method test:()Z 
     4: ifeq   9 
     7: iconst_1 
     8: ireturn 
     9: iconst_0 
     10: ireturn 

     boolean part(); 
     Code: 
     0: aload_0 
     1: invokespecial #2     // Method test:()Z 
     4: ifeq   9 
     7: iconst_1 
     8: ireturn 
     9: iconst_0 
     10: ireturn 

     boolean id(); 
     Code: 
     0: aload_0 
     1: invokespecial #2     // Method test:()Z 
     4: ireturn 

然而,所有版本究竟表現在熱點JVM相同的性能。