【发布时间】:2015-04-27 09:36:06
【问题描述】:
我需要重复追加字符串(大约 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。
【问题讨论】:
-
我建议您在循环进行时监控 GC 活动。您可能会遇到内存限制。
-
"我知道这两个是一样的。"不,他们不是。您的第二个代码在每次迭代时将
output转换为字符串,并使用字符串连接。你绝对不想那样做。 -
也许这是您的问题:“for 循环直到将字符串读入变量 'input' 的文件末尾”?向我们展示您如何设置阅读器以及您的阅读方式。
-
追加 50 个小子串,50K 次是不可能花费比几秒钟多得多的。如果花费的时间更长,则更有可能在您未提及的地方工作。我建议你分析你的应用程序。
-
@Seelenvirtuose :实际上我是从队列中读取它们的……不是从文件中读取的……所以,我一直读取到队列大小为零。
标签: java string performance append stringbuilder