有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可能增强AbstractStringBuilder的性能

我正在使用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长度与字符数组中要覆盖的空间不匹配的情况下,才应该执行此arraycopy

很明显的一个是非常< EME>绝望地考虑这是一个性能问题,尽管在StrugBuudor替换类中用更大的字符数组(和gt;500 k字符)和数组复制导致了可测量的性能改进。p>

在Windows 32位平台上使用java 6对同一个StringBuilder实例进行了测试,测试了大约一百万次替换调用

你认为这不重要,是虫子还是我完全错过了什么?


共 (1) 个答案

  1. # 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);