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

Is Java's printf() method efficient for concatenating and printing Strings?

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

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

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

我使用 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) + operaror + println() (0.22 秒):

System.out.println(nums[a] + " " + nums[b] + " " + nums[c] + " " + nums[d] + " "
                          + nums[e] + " " + nums[f]);

Does Java's printf() use slow concatenation when creating Strings?

绝对不会。串联没问题。

但是,由于对格式字符串的分析,它非常慢。有很多可能性和很多分支等等。

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

(*) %3$s.

之类的事情变得更加复杂