是Java';s printf()方法是否可以有效地连接和打印字符串?

是Java';s printf()方法是否可以有效地连接和打印字符串?,java,performance,printf,stringbuilder,Java,Performance,Printf,Stringbuilder,更新:我通过连接+操作符进行测试,性能几乎与使用StringBuilder进行测试相同(最终结果)。这表明,正如你们中的一些人在回答中提到的,性能下降是由于格式分析 结论:Java的printf()不是连接和打印字符串的有效方法。为了获得更好的性能,应该使用+操作符,或者最好使用StringBuilder Java的printf()在创建字符串时是否使用慢速连接?i、 e.在将每个元素附加到最后一个字符串后,是否会创建一个新字符串 我使用StringBuilder创建字符串进行了测试,获得了大约

更新:我通过连接
+
操作符进行测试,性能几乎与使用StringBuilder进行测试相同(最终结果)。这表明,正如你们中的一些人在回答中提到的,性能下降是由于格式分析

结论:Java的printf()不是连接和打印字符串的有效方法。为了获得更好的性能,应该使用
+
操作符,或者最好使用
StringBuilder

Java的
printf()
在创建字符串时是否使用慢速连接?i、 e.在将每个元素附加到最后一个字符串后,是否会创建一个新字符串

我使用
StringBuilder
创建字符串进行了测试,获得了大约4倍于运行时的性能改进。程序的这一部分在我的程序中被调用了数千次

两个测试之间的唯一区别是以下代码块:

1)
printf()
(0.8秒):

2)
StringBuilder
+
println()
(0.2秒):

3)
++
操作器+
println()
(0.22秒):

Java的printf()在创建字符串时是否使用慢速连接

当然不是。连接很好

但是,由于对格式字符串的分析,速度非常慢。有相当多的可能性和许多分支,还有其他的

几乎可以(*)预先解析字符串,并使用
列表
,其中每个
FormatItem
将处理一个参数(als还添加前面的所有固定文本)。有一次我做了这样的事情,速度快了2倍多


(*)由于
%3$s

之类的事情,它变得更加复杂。我猜连接是不相关的,但格式分析需要时间。您可以自己连接字符串,看看这是否有什么不同。如果不超过@chrylis,则最有可能是正确的,否则,您的可能是正确的,但是我不认为创建一个新字符串会导致性能下降。这种差异很可能发生在printf()中的格式分析中。我猜这是无关紧要的。这是一个微观优化,很可能会被你在代码中所做的事情、延迟等压倒。@duffymo大多数时候,大部分代码都与性能无关。若您的服务器主要生成一些简单的CSV文件,那个么它可能会变得相关。然而,遗憾的是,
String.
format`并没有得到更好的优化。
System.out.printf("%d %d %d %d %d %d\n", nums[a], nums[b],
    nums[c], nums[d], nums[e], nums[f]);
StringBuilder sb = new StringBuilder();
sb.append(nums[a]);
sb.append(' ');
sb.append(nums[b]);
sb.append(' ');
sb.append(nums[c]);
sb.append(' ');
sb.append(nums[d]);
sb.append(' ');
sb.append(nums[e]);
sb.append(' ');
sb.append(nums[f]);                  
System.out.println(sb.toString());
System.out.println(nums[a] + " " + nums[b] + " " + nums[c] + " " + nums[d] + " "
                          + nums[e] + " " + nums[f]);