AbstractStringBuilder可能的性能增强

时间:2012-03-08 13:03:45

标签: java performance stringbuilder

我正在使用Java StringBuilder进行测试,尤其是在AbstractStringBuilder类中实现的replace(int,int,String)函数,如下所示:

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长度与字符数组中要覆盖的空间不匹配,则应该只进行此数组复制。

显然,一个非常绝望地认为这是性能问题,尽管在StringBuilder替换类中使用更大的字符数组(> 500k字符)和arraycopy进行测试会导致可测量的性能提升。

在Windows 32位平台上使用java 6进行测试,使用相同的StringBuilder实例进行数百万次替换调用。

你会认为这不重要,是一个错误,还是我完全错过了什么?

1 个答案:

答案 0 :(得分: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);