编程语言
首页 > 编程语言> > Java编译器会为字符串混淆生成效率低下的代码吗?

Java编译器会为字符串混淆生成效率低下的代码吗?

作者:互联网

我认为这是隐藏字符串的最有效方法

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中的实际代码为

String s4 = (new StringBuilder(String.valueOf(s1))).append(s2).append(s3).toString();

哪种方法更有效?

更新

正如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);

它并不完美,但结果似乎证明我的版本快了30%.在我的笔记本电脑(Celeron 925)上,版本1大约需要230毫秒,而版本2则需要300毫秒.其实这就是我所期望的.因此,我认为如果Javac以更有效的方式编译字符串隐式化将是一个好主意.有足够的线像

return "\\Q" + s + "\\E";

即使在JDK类中.最后一行来自java.util.Pattern,其目的是提高效率

解决方法:

取决于执行它的环境.如果没有某种测试,就不可能断定一个人比另一个人更好.

就是说,我同意,提前知道最终尺寸可能会带来一些好处.

我怀疑如果您编写了一个微基准测试,您会发现在几乎所有应用程序中,差异绝对是微不足道的.

编辑基准建议:

我看到您已经在帖子中添加了一些实际数据.恭喜你!您在正确的轨道上:-)

不幸的是,Java有许多特性不利于编写正确的基准.如果您希望结果准确,则应该查看How do I write a correct micro-benchmark in Java?.同样值得考虑的是,在这种情况下看起来很大的加速在“真实”程序的情况下看起来会小得多.单个数据库获取(以毫秒为单位)可以轻松使内存分配中的任何收益完全变得毫无意义(以纳秒为单位).

标签:performance,javac,string-concatenation,java
来源: https://codeday.me/bug/20191031/1976711.html