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

时间:2015-02-25 11:46:25

标签: java string performance append stringbuilder

我需要重复追加字符串(大约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。

2 个答案:

答案 0 :(得分:3)

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

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

这可能会也可能不会帮助你。绝对应该避免第二个例子中的字符串连接 - 我感到惊讶的是,它没有产生巨大的差异......这表明它可能不是附加的&#39 ; s花时间,但无论如何阅读输入。

要对此进行测试,您应该尝试 for循环,这样您仍然可以阅读所有相同的输入,但不会附加到output一点都不。

答案 1 :(得分:1)

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

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

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

Took: 0.058 seconds