2014-11-04 31 views
3

的問題是有點曖昧,是這兩個等價的彙編代碼/性能明智的:如果(條件)else或if(條件),使用break時的性能是否存在差異?

public void example{ 
    do{ 
    //some statements; 
    if(condition) break; 
    //some statements; 
    }while(true); 
} 

與:

public void example{ 
    do{ 
    //some statements; 
    if(condition){ 
    break; 
    }else{ 
    //some statements; 
    } 
    }while(true); 
} 
+1

這取決於編譯器,並可能會看起來是一樣的,你有沒有嘗試看看這些選項的組合? – MByD 2014-11-04 21:08:46

+0

答案是,不,應該不會有性能差異(假設智能設計的編譯器)。已經完成了條件的必要比較,因此「其他」沒有額外的性能成本。 我沒有資源來支持自己,這就是爲什麼我要評論而不是回答。 – 2014-11-04 21:13:07

+3

在這兩種選擇之間進行優化的努力是不值得的。 – khelwood 2014-11-04 21:13:48

回答

4

他們是等價的,他們應該導致相同的字節碼錶示。因此在性能方面,它們是相同的。

if,elsebreak是分支指令。在這種情況下,break會終止循環,並且程序轉到另一個分支。如果條件不符合,則採取另一個分支,即,正好是else所採用的相同分支。

使用javac編譯器示例:

int a = System.in.read(); 
do { 
    System.out.println("a"); 
    if (a > 0) { 
     break; 
    } else { 
     System.out.println("b"); 
    } 
} while (true); 

既此又沒有else產生如下:

getstatic java/lang/System/in Ljava/io/InputStream; 
invokevirtual java/io/InputStream/read()I 
istore_1 
getstatic java/lang/System/out Ljava/io/PrintStream;   :label1 
ldc "a" 
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 
iload_1 
ifle <label2> 
goto <label3> 
getstatic java/lang/System/out Ljava/io/PrintStream;   :label2 
ldc "b" 
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V 
goto <label1> 
return               :label3 
+3

它*應*,但它呢?這對編譯器來說不是一個簡單的優化。 – JJJ 2014-11-04 21:12:44

+2

在Oracle javac上試用了它,結果是完全相同的字節碼。 – manouti 2014-11-04 21:14:45

+2

@Juhana我想不出任何理由,這不會是微不足道的。至於它是否確實會導致相同的字節碼,答案將取決於編譯器(因此它必須在每個編譯器的基礎上進行測試)。 – 2014-11-04 21:15:13