java - Java中 "if"条件的奇怪优化

标签 java compiler-optimization

我决定检查 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
}

我很好奇,当它可以优化为更简单的东西时,为什么它执行冗余指令?

最佳答案

javac 没有或只做很少的优化。优化发生在字节码的即时 (JIT) 编译期间。 这是有道理的,因为通过这种方法,您可以针对不同的目标平台进行不同的优化,并获得最大的优化结果。

关于java - Java中 "if"条件的奇怪优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405045/

相关文章:

java - 有没有办法为Spring生成applicationContext.xml?

java - 表单支持 bean 不保留已设置的属性值

c# - 编译器可以优化字符串上的 ToString() 吗?

c# - 为什么 .NET JIT 编译器决定不内联或优化对没有副作用的空静态方法的调用?

c++ - 为什么标准的 "abs"函数比我的快?

java - 如何使用 DateTimeFormatter 获得一致性

java - Jersey Rest Get 具有特殊特征

java - Android Intent问题(显示新表单)

java - java不适合被多次调用的短进程吗?

c# - List<T>.RemoveAll() 效率/编译器优化