java - AbstractStringBuilder 可能的性能增强

标签 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 函数调用确实“移动”了值字符数组的内容,以便为以后注入(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/

相关文章:

performance - 如何在 Matlab 中进行高效的 k 最近邻计算

java - 问题 : Java-Read socket (Bluetooth) input stream until a string (&lt;! MSG>) 被读取

java - 既然我们已经有了 StringBuilder,为什么还要使用 StringJoiner?

java - 使用 byte[] 生成 key 会为 MAC 和 Windows 生成不同的结果

java - split vector

java - 如何使用 Json 对象的动态属性名称

java - 需要帮助编写测试

java - 对机器人进行编程以探索网格

javascript - 在网页中嵌入二进制数据?

c# - StringBuilder 和 JSON 的问题