2012-03-08 103 views
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實例,用於幾百萬個替換調用。

你認爲這是不重要的,錯誤還是我完全錯過了某些東西?

+1

不重要的,絕對。 – vulkanino 2012-03-08 13:07:44

+0

向Oracle/Sun提交請求並查看他們的意見。我不認爲這是一個「錯誤」,因爲代碼有效。把它稱爲一個可能的增強,你可能會進一步。我也認爲你可能完全錯過了一些東西。你可能正在考慮一個通常不是有效的角落案例。我現在沒有時間來驗證你的思路。 – duffymo 2012-03-08 13:09:26

+0

我懷疑arraycopy是否足夠聰明以避免不必要的工作;唯一的性能改進來自避免確定工作不必要的檢查。實際上,我認爲你有一個觀點。 – 2012-03-08 13:14:20

回答

1

我會將其作爲增強請求傳遞給它。

喜歡的東西

if (end != start + len) 
    System.arraycopy(value, end, value, start + len, count - end); 

進一步的增強是改變陣列複製。

public static void arraycopy(Object src, int srcPos, 
            Object dest, int destPos, 
            int length) { 
    if (srcPos != destPos && length != 0) 
     arraycopy0(src, srcPos, dest, destPos, length); 

}

private static native void arraycopy0(Object src, int srcPos, 
            Object dest, int destPos, 
            int length);