Java StringBuilder 参数性能

标签 java performance memory stringbuilder

我遇到了以下代码:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
   String line = "foo" + Integer.toString(i) + "bar\n";
   sb.append(line);
}
System.out.print(sb.toString());

我的问题是使用以下代码会带来什么性能/内存差异:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
   sb.append("foo").append(Integer.toString(i)).append("bar\n");
}
System.out.print(sb.toString());

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
   sb.append(String.format("foo %i bar", i\n));
}
System.out.print(sb.toString());

我看到很多问题/答案表明使用:StringcumulativeOutput = ""; ...cumulativeOutput += "foo"+ Integer.toString(i) + "bar\n"; 是浪费(本质上是在每次循环迭代上创建一个新的 StringBuilder),但没有看到任何有关的直接答案上述情况。我还发现字符串的长度很重要,并且有兴趣了解以下代码如何进行比较:

StringBuilder sb = new StringBuilder();
String foo = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ";
String bar = " Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n";
for (int i = 1000000000; i < 1000100000; i++) {
   String line = foo + Integer.toString(i) + bar;
   sb.append(line);
}
System.out.print(sb.toString());

我预计第二个循环将是最快的(链接.append),但我对是否有一些隐藏的细节感兴趣。期待看到其他人发现或知道什么!

最佳答案

你的第一个例子:

String line = "foo" + Integer.toString(i) + "bar\n";
sb.append(line);

相当于:

String line = new StringBuilder("foo").append(Integer.toString(i)).append("bar\n").toString();
sb.append(line);

你的第三个例子:

sb.append(String.format("foo %i bar", i\n));

是最浪费的,因为它相当于:

StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
formatter.format("foo %i bar", i);
String value = formatter.out().toString();
sb.append(value);

您的第二个示例具有最佳性能,但 Integer.toString 的使用是多余的,并且会创建不必要的字符串:

sb.append("foo").append(i).append("bar\n");

在此形式中,不会创建新对象(除非 StringBuilder 必须扩展其内部缓冲区)。

差异非常小,通常小得难以察觉。可以运行 Microsoft Office 或 Doom Eternal 的现代系统可能不会明显减慢创建字符串的速度。即时编译器完全有可能在运行时将 append(Integer.valueOf(i)) 转换为 append(i)

如果您需要有关最佳实践的指导,答案是:根本不要在循环中使用 +String.format

关于Java StringBuilder 参数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70994407/

相关文章:

java - Zebra Android SDK 中的错误 "ACCESS_TAG_MEMORY_OVERRUN_ERROR"是什么意思以及如何修复它?

jquery - 委托(delegate)是最快的绑定(bind)方式吗?

c++ - (如何)我可以使用 LLVM 机器代码分析器预测代码片段的运行时间吗?

c++ - 如何从进程内部确定 CPU 和内存消耗

csv - Clojure - 解析小型 CSV 文件的内存使用情况

c - 内联汇编中的内存偏移量

java - NetBeans 分析菜单....丢失?

java - Googleapis.com 未知主机异常

java - 登录后重定向到自定义网址

mysql - MySQL 是将整行加载到内存中,还是只加载 WHERE、ORDER BY 和 GROUP BY 中使用的列?