gpt4 book ai didi

java - 为什么java编译器不重写这段代码?

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:36 27 4
gpt4 key购买 nike

我正在使用这段代码进行测试:

public class TestNull {
public void leftComparison(String s) {
if (s == null);
}
public void rightComparison(String s) {
if (null == s);
}
}

我是用javac 1.8.0_05编译的,然后查看字节码:

public class TestNull {
....
public void leftComparison(java.lang.String);
Code:
0: aload_1
1: ifnonnull 4
4: return

public void rightComparison(java.lang.String);
Code:
0: aconst_null
1: aload_1
2: if_acmpne 5
5: return
}

显然,leftComparison 被编译为在堆栈上压入和弹出 1 个变量,而 rightComparison 压入和弹出 2。我推测 leftComparison 是因此比 rightComparison 稍微更有效?

我想知道为什么编译器不重写rightComparison的代码?在我看来,这两个比较在语义上应该是等价的,对吧?

最佳答案

Java 字节码编译器在优化方面做得很少。严肃的优化工作几乎全部由 JIT 编译器完成。

I'm wondering why the compiler doesn't rewrite the code of rightComparison?

因为重写它没有意义。 JIT 编译器应该能够处理这两个版本,并且很可能为这两个版本生成最佳( native )代码。 (有兴趣的可以去看看,有办法可以看到JIT编译器生成的native代码。)

(另请参阅@codenheim 的回答以获得更技术性的解释。)

In my opinion, the two comparisons should be semantically equivalent, right?

这是正确的……但这并不意味着字节码编译器有义务为两个版本生成相同的字节码序列。


这里的真正教训是字节码编译器生成的字节码序列告诉您很少您的代码实际将如何执行。您可能从阅读字节码中得出的任何性能结论都是高度怀疑的。

关于java - 为什么java编译器不重写这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24901085/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com