Java的printf()方法是否有效连接和打印字符串?

时间:2015-04-15 15:38:09

标签: java performance printf stringbuilder

更新 :我通过与+运算符连接进行测试,其性能几乎与使用StringBuilder进行相同(结果)到底)。这表明,正如你们有些人在答案中提到的那样,性能下降是由于格式分析造成的。

结论:Java的printf()不是连接和打印字符串的有效方法。应使用+运算符或最好使用StringBuilder来提高性能。

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

我使用StringBuilder测试来创建字符串我获得了性能提升约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]);

1 个答案:

答案 0 :(得分:1)

  

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

绝对没有。串联很好。

然而,由于格式字符串的分析,它非常慢。有很多可能性和很多分支以及其他什么。

几乎(*)可以预先解析字符串并使用List<FormatItem>,其中每个FormatItem将处理一个参数(也可以添加所有前面的固定文本)。一旦我做了这样的事情,它的速度提高了2倍。

(*)%3$s之类的内容变得更加复杂。