我正在使用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实例进行数百万次替换调用。
你会认为这不重要,是一个错误,还是我完全错过了什么?
答案 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);