我需要重复追加字符串(大约50次),这是另一个StringBuilder的子字符串。我需要这样做大约30k的投入。我需要6分钟左右的时间。
StringBuilder input = new StringBuilder(10000);
StringBuilder output = new StringBuilder(10000);//for循环到文件末尾,该循环将字符串读入变量“输入”
{
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。
发布于 2015-02-25 11:56:34
最有可能的是性能问题在其他地方,因为这不应该超过一秒钟。我建议您分析一下您的应用程序,以确定其实际花费在何处的处理时间。
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发布于 2015-02-25 11:52:32
您绝对可以避免使用append的重载来创建这么多对象,这允许您指定子序列:
for (...)
{
output.append(input, 1, 8);
output.append(input, 33, 45);
output.append(input, 20, 25);
}这对你可能有帮助,也可能没有帮助。您的第二个示例中的字符串连接绝对应该避免--我很惊讶这并没有产生很大的差异.这意味着很可能并不是附加的东西占用了时间,而是任何读取输入的东西。
为了测试这一点,您可能应该尝试一个空的for循环,以便仍然读取所有相同的输入,但根本不附加到output中。
https://stackoverflow.com/questions/28718227
复制相似问题