追加字符串 - 性能问题 - Java 6

Append Strings - Performance issue - Java 6

我需要重复附加字符串(大约 50 次),这是另一个 StringBuilder 的子字符串。 我需要为大约 30k 输入执行此操作。 这需要我大约 6 分钟的时间。

 StringBuilder input = new StringBuilder(10000);
    StringBuilder output = new StringBuilder(10000);

//for 循环直到文件末尾,将字符串读入变量 'input'

{
output.append(input.substring(1, 8));
output.append(input.substring(33, 45));
output.append(input.substring(20, 25)); // and so on
}

这花了大约 6 分钟。

所以,我尝试了

{


 output.append(input.substring(1, 8) + output.append(input.substring(33, 45) + output.append(input.substring20, 25) + .. // and so on );

}

这个,也有同步的。我知道这两个是一样的。

但是,即使我使用了 StringBuilder,为什么我仍然有性能延迟?我做错了什么吗?

我提到了:StringBuilder vs String concatenation in toString() in JavaString concatenation in Java - when to use +, StringBuilder and concat 等等。 他们中的大多数建议使用 StringBuilder。

您绝对可以避免使用 append 的重载创建如此多的对象,它允许您指定一个子序列:

for (...)
{
    output.append(input, 1, 8);
    output.append(input, 33, 45);
    output.append(input, 20, 25);
}

这可能对您有帮助,也可能没有帮助。你的第二个例子中的字符串连接绝对应该避免 - 我很惊讶它没有造成 huge 差异......这表明它很可能不是花时间的追加,但是不管是在读取输入。

为了测试这一点,您应该尝试一个 empty for 循环,这样您仍然在读取所有相同的输入,但不会附加到 output 完全没有。

性能问题很可能出在其他地方,因为这不会超过一秒钟。我建议您分析您的应用程序以确定它实际花费处理时间的地方。

long start = System.currentTimeMillis();
char[] chars = new char[500];
Arrays.fill(chars, '.');
for (int i = 0; i < 30000; i++) {
    String input = new String(chars);
    StringBuilder output = new StringBuilder();
    for (int j = 0; j < 50; j++) {
        output.append(input, j * 10, j * 10 + 9);
    }
    String out = output.toString();
}
System.out.println("Took: " + (System.currentTimeMillis() - start) / 1e3 + " seconds");

打印 30,000 个字符串的 50 个子字符串

Took: 0.058 seconds