Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的“优化”;如果;Java中的条件_Java_Compiler Optimization - Fatal编程技术网

奇怪的“优化”;如果;Java中的条件

奇怪的“优化”;如果;Java中的条件,java,compiler-optimization,Java,Compiler Optimization,我决定检查Java编译器的洞察力;因此,我编写了一个简单的类 public class Foo { public Foo(boolean a, int b) { if (a == true && a != false) { b = 1; } } } 我想知道编译器是否会将条件优化为更简单的方式,如: if (a == true) {} 我编译了这个类,然后用javap工具对它进行了反汇编。当我查看输出时,

我决定检查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
}
从“Foo.java”编译而来
公开课Foo{
公共Foo(boolean,int);
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:iload_1
5:iconst_1
6:if_icmpne 15
9:iload_1
10:ifeq 15
13:iconst_1
14:istore_2
15:返回
}

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

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

它不一定是一个常见的用例。编译器旨在预见并防止编译毫无意义的东西。@itachi不太可能。编写代码有很多愚蠢的方法,为所有这些方法编写优化会使编译器难以维护,并且容易出现错误。在完全逆转Minecraft之后,我可以有把握地说Java很少(如果有的话)进行语义优化。