2012-01-13 68 views
0

我只是想知道,實際上更多高效供編譯器使用?在java中更高效的是什麼? If-return-else或If-return?

if (condition) { 
    return something; 
} else { 
    dosomething();  
} 

OR

if (condition) { 
    return something; 
} 
dosomething(); 

我知道這些都是非常低的差異,而且更易讀的版本應該選擇,但讓剛說,我們將執行該代碼十億倍,哪一個會更高效?

我也知道在「現實世界」中沒有任何收益,但我只是好奇。

+0

的各種問題重複: http://stackoverflow.com/q/7921359/143897 http://stackoverflow.com/q/1370865/143897 – 2012-01-13 07:33:58

+0

@JayD的問題是相關的,但他們不重複IFAICS。但我會投票給一個非建設性的問題... – 2012-01-13 07:40:26

+0

這個問題是不可能回答的,因爲它高度依賴於編譯器的實現細節。此外,差異很小,因此不值得花時間去擔心這一點。 – Jesper 2012-01-13 08:26:54

回答

6

沒有性能上的差異被發現。 bytecode包含相同的指令,以相同的順序操作相同的數據。

L0 
    LINENUMBER 11 L0 
    ICONST_1 
    ISTORE 0 
    L1 
    LINENUMBER 12 L1 
    ILOAD 0 
    IFEQ L2 
    L3 
    LINENUMBER 13 L3 
    GETSTATIC p/A.something : Ljava/lang/Object; 
    ARETURN 
    L2 
    LINENUMBER 15 L2 
    FRAME APPEND [I] 
    INVOKESTATIC p/A.dosomething()V 
    L4 
    LINENUMBER 17 L4 
    ACONST_NULL 
    ARETURN 
    L5 
    LOCALVARIABLE condition Z L1 L5 0 
    MAXSTACK = 1 
    MAXLOCALS = 1 

L0 
    LINENUMBER 7 L0 
    ICONST_1 
    ISTORE 0 
    L1 
    LINENUMBER 8 L1 
    ILOAD 0 
    IFEQ L2 
    L3 
    LINENUMBER 9 L3 
    GETSTATIC p/B.something : Ljava/lang/Object; 
    ARETURN 
    L2 
    LINENUMBER 11 L2 
    FRAME APPEND [I] 
    INVOKESTATIC p/B.dosomething()V 
    L4 
    LINENUMBER 12 L4 
    ACONST_NULL 
    ARETURN 
    L5 
    LOCALVARIABLE condition Z L1 L5 0 
    MAXSTACK = 1 
    MAXLOCALS = 1 

public class A { 
    static Object something = new Object(); 
    public static void main(String[] args) { 
     test(); 
    } 
    private static Object test() { 
     boolean condition = true; 
     if (condition) { 
      return something; 
     } else { 
      dosomething(); 
     } 
     return null; 
    } 
    private static void dosomething() {} 
} 

public class B { 
    static Object something = new Object(); 
    public static void main(String[] args) { 
     test(); 
    } 
    private static Object test() { 
     boolean condition = true; 
     if (condition) { 
      return something; 
     } 
     dosomething(); 
     return null; 
    } 
    private static void dosomething() {} 
} 
1

它根本不會產生顯着差異。意識到else並未評估另一個表達式,而只是說如果原始條件爲假,請執行此操作。 Condition仍然評估一次。

事實上,根據不同編譯器所做的優化,它可能會導致相同的字節碼。 IDE有很多插件來查看Java字節碼。

1

任何收益都可以忽略不計,如果結果說明完全相同,我不會感到驚訝。

你幾乎總是專注於'低垂的果實',而不是如此小的性能微觀優化。

Err在可讀性方面。並且經常測量以確保您確實存在性能瓶頸。

1

我懷疑在性能上有很大的不同,但我傾向於選擇後者,因爲前者會導致縮進地獄。

即使執行該代碼十億次,doSomething()幾乎肯定會在時間上佔用if/else

我總是首先對可讀性進行優化,並且只有在性能成爲問題時才擔心。

不可讀的代碼是遠遠超過稍慢代碼的問題更多:-)

2

有兩個版本沒有任何區別。只有純粹從可讀性的角度來看,差異才是可能的。

如果您採用的是在函數開始時進行檢查並儘快執行返回的樣式,那麼第二個就會出現。

void foo() 
{ 
    if (condition1) 
     return; 
    if (goo()) 
     return; 
    //... 
} 

否則,第一個版本提供更多可見的分支。

0

我相信這只是個人喜好。

一些更多的信息答案在此question

相關問題