更新:我通过与+
运算符的连接进行了测试,其性能与使用StringBuilder进行的性能几乎相同(最终结果)。正如您在回答中提到的那样,这表明性能下降是由于格式分析所致。
结论:Java的printf()并不是连接和打印字符串的有效方法。任一+
操作者或优选StringBuilder
应该用于更好的性能。
printf()
创建字符串时,Java是否使用慢速连接?即是否在将每个元素附加到最终字符串后创建新的字符串?
我使用aStringBuilder
进行了测试,创建了字符串,使运行时间提高了约4倍。该程序的这一部分在我的程序中被调用了数千次。
两次测试之间的唯一区别是以下代码块:
1)printf()
(0.8秒):
System.out.printf("%d %d %d %d %d %d\n", nums[a], nums[b],
nums[c], nums[d], nums[e], nums[f]);
2)StringBuilder
+ println()
(0.2秒):
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());
3)+
运算子+ println()
(0.22秒):
System.out.println(nums[a] + " " + nums[b] + " " + nums[c] + " " + nums[d] + " "
+ nums[e] + " " + nums[f]);
创建字符串时,Java的printf()是否使用慢速连接?
绝对没有 串联是很好的。
但是,由于格式字符串的分析,它的速度相当慢。有很多可能性,很多分支以及其他功能。
几乎可以(*)预先解析字符串,并使用a来处理List<FormatItem>
每个FormatItem
参数(al还会添加所有前面的固定文本)。一旦我做了这样的事情,它快了2倍以上。
(*)诸如此类变得更加复杂%3$s
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句