3
我在做與Java StringBuilder的測試,尤其是其在AbstractStringBuilder類作爲遵循實施替換(INT,INT,字符串)功能:可能的性能增強了AbstractStringBuilder
public AbstractStringBuilder replace(int start, int end, String str) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (start > count)
throw new StringIndexOutOfBoundsException("start > length()");
if (start > end)
throw new StringIndexOutOfBoundsException("start > end");
if (end > count)
end = count;
int len = str.length();
int newCount = count + len - (end - start);
if (newCount > value.length)
expandCapacity(newCount);
System.arraycopy(value, end, value, start + len, count - end);
str.getChars(value, start);
count = newCount;
return this;
}
的Arraycopy函數調用將「移動」部分值字符數組的內容以爲後面注入的str內容(str.getChars(value,start))留出空間。從我的角度來看,如果str長度與字符數組中要覆蓋的空間不匹配,則只應該執行此arraycopy。
顯然是一個非常絕望考慮這個性能問題,雖然有較大的字符數組(> 50萬個字符)和一個StringBuilder類替代含鉛可衡量的績效改進arraycopy做測試。
在Windows 32位平臺上用java 6測試了一個相同的StringBuilder實例,用於幾百萬個替換調用。
你認爲這是不重要的,錯誤還是我完全錯過了某些東西?
不重要的,絕對。 – vulkanino 2012-03-08 13:07:44
向Oracle/Sun提交請求並查看他們的意見。我不認爲這是一個「錯誤」,因爲代碼有效。把它稱爲一個可能的增強,你可能會進一步。我也認爲你可能完全錯過了一些東西。你可能正在考慮一個通常不是有效的角落案例。我現在沒有時間來驗證你的思路。 – duffymo 2012-03-08 13:09:26
我懷疑arraycopy是否足夠聰明以避免不必要的工作;唯一的性能改進來自避免確定工作不必要的檢查。實際上,我認爲你有一個觀點。 – 2012-03-08 13:14:20