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
.
之类的事情变得更加复杂
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
.