2012-08-24 17 views
3

可能重複:
for loop optimization在Java中優化for-loop有用嗎?

比方說,我們要循環字符串s的字符。我會說下面的代碼或多或少是默認的。

for(int i = 0; i < s.length(); i++) { 
    doSomethingWith(s.charAt(i)); 
} 

問題#1:爲什麼我經常看到以下內容?

final int length = s.length(); 
for(int i = 0; i < length; i++) { 
    doSomethingWith(s.charAt(i)); 
} 

乍一看,因爲不平等在每個迭代上評估,這似乎是合理的。不過我希望虛擬機優化這個,因爲字符串是不可變的。有什麼想法嗎?如果我們迭代一個可變結構(這不會被任何其他線程引用)呢?那麼如果length()不能保證在O(1)中運行呢?

問題2:有些人似乎認爲對i++加快代碼替換++i。他們是對的嗎?這又不是我所期望的,但我不確定。

我們都知道不要過早優化。同時,如果我們能夠以幾乎任何代價生產稍微快一點的代碼,我們都不會愚蠢。當然可以爭辯說,「優化」都會影響可讀性,但在我看來,這種損害非常小,在某些情況下是合理的。

我試圖測量任何性能差異,但很難得出確鑿的結果。雖然這應該解決它的任何特定的應用程序,我在這裏瞄準洞察力和一般的答案。

(雖然我記寫這與HotSpot虛擬機可能是也很有意思考慮其他平臺,如移動設備)。

回答

5

問題1:爲什麼我經常看到下面的?

第一個例子是一個不成熟的優化。人們這樣做的原因是他們通常不會查看他們的代碼來查看真正的瓶頸所在,而只是試圖猜測。

而如果長度()不能保證爲O(1)運行?

那麼做這個優化會更有意義。如果您知道計算長度是一項昂貴的操作並且該值不會改變,那麼計算一次並存儲結果可能會提高性能。

問題2:有些人認爲代++我爲我++加快代碼。他們是對的嗎?這又不是我所期望的,但我不確定。

他們是不對的。他們的論點是,i++必須創建變量的臨時副本,而++i不會。很久以前,當編譯器不善於優化時,這在C或C++中是真實的。Java不適用。

3

乍一看,這似乎是合理的,因爲在每次迭代中評估不等式。不過我希望虛擬機優化這個,因爲字符串是不可變的。

編譯器優化了這一點。像i < s.length();這樣做是好的。

有些人似乎認爲用++ i代替i ++會加快代碼速度。

這不,除非你指定的東西的++ i的

返回值