您已經發布兩個片斷,我不想說。我同意Will的觀點,認爲它幾乎可以肯定與代碼的整體性能無關 - 如果不是這樣,那麼您可以直接進行更改,並確定硬件上的JVM數據對於您的數據最快。
也就是說,如果首先將字符串轉換爲char數組,然後在數組上執行迭代,則第二個代碼段可能會更好。這樣做會執行一次字符串開銷(轉換爲數組)而不是每次調用。此外,您可以將數組直接傳遞給帶有一些索引的String構造函數,這比使用數組的char out單獨傳遞它(然後變成單字符數組)更有效:
String s = "abcdefg";
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++) {
newFunction(String.valueOf(chars, i, 1));
}
但是爲了強化我的第一點,當你在String.charAt()
的每個調用中查看實際避免的內容時 - 它是兩個邊界檢查,一個(懶惰)布爾OR或一個加法。這不會有什麼明顯的差異。在String構造函數中也沒有區別。基本上,這兩個成語在性能方面都很好(既不立即明顯效率低下),所以除非分析器顯示這佔用了大量應用程序的運行時間,否則不應該花更多時間在它們上面工作。即使這樣,您幾乎可以肯定會通過重組您的支持代碼來獲得更多的性能提升(例如,newFunction
佔用了整個字符串本身)。 java.lang.String在這一點上已經很好的優化了。
由於這將通過一個字符串,你需要在第一次測試中稍微改變你的測試。 {char [] s =「abcdefg」.toCharArray();}應該在循環內部,或者甚至更好(爲了防止JVM進行聰明的優化,把整個循環和.toCharArray()放在一個單獨的函數中)。衡量所有初始開銷以及循環成本非常重要。特別是因爲性能可能會根據字符串長度從一個切換到另一個。因此測試不同長度的蜇傷也很重要。 – MatBailie 2009-11-04 09:16:10
+1實際回答問題。 – gustafc 2009-11-04 10:56:19
在循環內移動了「s」,並添加了一個assert()以防止newFunction()的JVM優化。當然現在比較慢,但相對的測量結果仍然相同。我的觀點僅僅是如果問題確切地知道,有可能進行優化。重點不是要更改某個操作使用哪個函數,而是要在更高級別上查看該操作以獲得改進,例如,通過緩存 – mhaller 2009-11-04 19:40:08