我决定检查Java编译器的明显性;因此,我写了一个简单的课程。
public class Foo {
public Foo(boolean a, int b) {
if (a == true && a != false) {
b = 1;
}
}
}
我想知道编译器是否会将条件优化为更简单的条件:
if (a == true) {}
我编译了该类,然后使用javap
工具对其进行了反汇编。当我看一下输出时,我真是傻眼了,因为编译器检查了这两个条件,下面清楚地显示了这些。
Compiled from "Foo.java"
public class Foo {
public Foo(boolean, int);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: iload_1
5: iconst_1
6: if_icmpne 15
9: iload_1
10: ifeq 15
13: iconst_1
14: istore_2
15: return
}
我只是好奇,为什么它可以执行冗余指令,什么时候可以优化到更简单的东西?
答案 0 :(得分:14)
javac
没有或只有很少的优化。在字节码的即时(JIT)编译期间发生优化。
这是有道理的,因为通过这种方法,您可以针对不同的目标平台进行不同的优化,并获得最大的优化结果。