Java编译器为字符串浓缩生成低效代码?
我认为这是连接字符串最有效的方法Java编译器为字符串浓缩生成低效代码?,java,performance,javac,string-concatenation,Java,Performance,Javac,String Concatenation,我认为这是连接字符串最有效的方法 new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString(); 这里创建的StringBuilder缓冲区的容量足以容纳其中的所有字符串,否则StringBuilder可能需要将缓冲区扩展3倍 但是当我编译/反编译这个 String s4 = s1 + s2 + s3; 我得到了javac(1.7.0_03)构建的.
new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
这里创建的StringBuilder缓冲区的容量足以容纳其中的所有字符串,否则StringBuilder可能需要将缓冲区扩展3倍
但是当我编译/反编译这个
String s4 = s1 + s2 + s3;
我得到了javac(1.7.0_03)构建的.class中的实际代码
哪种方式更有效
更新
正如Steven Schlansker所建议的,这里是一个性能测试
String s1 = "0123456789";
String s2 = s1 + s1 + s1;
String s3 = s1 + s1 + s1 + s1 + s1 + s1;
long t0 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
String s4 = new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
// String s4 = s1 + s2 + s3;
}
System.out.println(System.currentTimeMillis() - t0);
甚至在JDK类中。最后一行来自java.util.Pattern,它是为提高效率而设计的取决于执行它的环境。如果没有某种测试,就不可能肯定地得出一个比另一个好的结论 也就是说,我同意提前知道最终尺寸可能会带来一些好处 我怀疑,如果你写一个微基准,你会发现在几乎任何应用程序中,差别都是微不足道的 编辑基准建议: 我看到你在帖子中添加了一些实际数据。祝贺你走对了道路:-)
不幸的是,Java有许多不利于编写正确基准的特性。如果你想让你的结果准确,你可能应该看看。同样值得考虑的是,在这种情况下看起来很大的加速比在“真正”的程序中看起来要小得多。一次数据库获取(以毫秒为单位)很容易使内存分配中的任何收益变得毫无意义(以纳秒为单位)。如果您希望提高效率,我会使用
Pattern.compile(s,Pattern.LITERAL)代码>这将只需对每个字符串执行一次s
,避免创建StringBuilder和解析字符串。
String s1 = "0123456789";
String s2 = s1 + s1 + s1;
String s3 = s1 + s1 + s1 + s1 + s1 + s1;
long t0 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
String s4 = new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();
// String s4 = s1 + s2 + s3;
}
System.out.println(System.currentTimeMillis() - t0);
return "\\Q" + s + "\\E";