比方說,我們要循環字符串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虛擬機可能是也很有意思考慮其他平臺,如移動設備)。