我需要重复追加字符串(大约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 Java 和String concatenation in Java - when to use +, StringBuilder and concat等等。 他们中的大多数建议使用StringBuilder。
答案 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