Java 中 "if" 条件的奇怪优化
Strange optimization of "if" conditions in Java
我决定检查 Java 编译器的洞察力;因此,我写了一个简单的 class.
public class Foo {
public Foo(boolean a, int b) {
if (a == true && a != false) {
b = 1;
}
}
}
我想知道编译器是否会将条件优化为更简单的内容,例如:
if (a == true) {}
我编译了class,然后用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
}
我很好奇,当它可以优化为更简单的东西时,为什么它执行冗余指令?
javac
没有或只做了很少的优化。优化发生在字节码的即时 (JIT) 编译期间。
这是有道理的,因为通过这种方法,您可以针对不同的目标平台进行不同的优化,并获得最大的优化结果。
我决定检查 Java 编译器的洞察力;因此,我写了一个简单的 class.
public class Foo {
public Foo(boolean a, int b) {
if (a == true && a != false) {
b = 1;
}
}
}
我想知道编译器是否会将条件优化为更简单的内容,例如:
if (a == true) {}
我编译了class,然后用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
}
我很好奇,当它可以优化为更简单的东西时,为什么它执行冗余指令?
javac
没有或只做了很少的优化。优化发生在字节码的即时 (JIT) 编译期间。
这是有道理的,因为通过这种方法,您可以针对不同的目标平台进行不同的优化,并获得最大的优化结果。