Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java编译器为字符串浓缩生成低效代码?_Java_Performance_Javac_String Concatenation - Fatal编程技术网

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";