2012-03-19 48 views
4

在Java中,使用post increment vs pre increment operator會有什麼性能影響?後增量和增量前運算符之間的性能差異?

實施例:

i++ 

++i 
+2

據我所知,沒有差異,表現方向 – 2012-03-19 16:52:15

+0

運行測試並找出? – cdeszaq 2012-03-19 16:52:41

+0

[非常基本的代碼性能]的可能的重複(http://stackoverflow.com/questions/4110764/very-basic-code-performance) – assylias 2012-03-19 16:57:22

回答

13

甲性能問題纔有意義在上下文其中功能行爲是相同的(因爲,如果功能性是不同的,一個正確的行爲優於一個微小更快的一個),所以我假設你指的是不使用表達式的值的情況?也就是說,表達式的唯一目的是增加i?在這種情況下,答案是否定的:沒有性能差異,事實上,沒有任何區別。我剛剛編譯了這個類:

public class Foo 
{ 
    public static void main(final String args[]) 
    { 
     int i = Integer.parseInt(args[0]); 
     i++; 
    } 
} 

並計算得到的Foo.class的MD5校驗和;並且類似地用++i代替。他們有相同的校驗,表明這兩個版本被編譯成確切相同的字節,因此將執行字面上相同。

(當然,這在理論上可以,取決於編譯器。不同的編譯器可能會決定甚至在上下文,他們是相當於編譯i++不同於++i,但我懷疑,這是真的不值得擔憂的,即使它的情況。)

+1

不是一個答案,除非你是聲稱'我=我++;'和'I = ++我;'編譯成相同的代碼。 – EJP 2012-03-19 23:44:30

+2

@EJP:你能否詳細說明它的相關性? – ruakh 2012-03-19 23:47:12

+1

這是相關的,因爲顯然這些語句*不會*編譯爲相同的字節碼,並且如果不能滿足您的要求,則很容易構建更多的語句。你遇到了前置或後置無關緊要的例外情況。如果它真的*在所有情況下都不重要,那麼你將不會在語言中擁有它們,對嗎? – EJP 2012-03-20 00:01:06

1

的增量所需的運行本身應該是相同的,但如果您使用的是前或後增量明顯可能對周圍的代碼對性能的影響並且在更多情況下可以優化後增量。

也有一些不明顯的情況下,如果周圍的代碼的性能變化。至少當與Oracle在x86或x64硬件服務器虛擬機上運行,​​下面的循環在其運行時顯著差異:

long a=0, b=0; 
for(int i=0;i<1000000;i++) { 
    b = 3; 
    a += i * (b++); 
} 

...

long a=0, b=0; 
for(int i=0;i<1000000;i++) { 
    b = 3; 
    a += i * (++b); 
}