gpt4 book ai didi

java - AbstractStringBuilder 可能的性能增强

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:06 25 4
gpt4 key购买 nike

我正在使用 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 函数调用确实“移动”了值字符数组的内容,以便为以后注入(inject)的 str 内容 (str.getChars(value, start)) 腾出空间。从我的角度来看,如果 str 长度与字符数组中要覆盖的空间不匹配,则应该只执行此 arraycopy。

很明显,有人非常不顾一切地认为这是一个性能问题,尽管在 StringBuilder 替换类中使用更大的字符数组(>500k 个字符)和 arraycopy 进行测试导致可衡量的性能改进。

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

您认为这不重要,是一个错误还是我完全遗漏了什么?

最佳答案

我会将其作为增强请求传递。

有点像

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);

关于java - AbstractStringBuilder 可能的性能增强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com