Ich habe eine einfache Klasse für die Zwecke der Veranschaulichung bekam:Warum optimiert der Java-Compiler keine triviale Methode?
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
Der Bytecode vom Compiler (kontrolliertt javap -c Test.class
) hergestellt ist folgende:
public int test1();
Code:
0: bipush 100
2: istore_1
3: sipush 200
6: istore_1
7: iload_1
8: ireturn
public int test2();
Code:
0: sipush 200
3: ireturn
Warum ist die Optimierung der Compiler nicht die test1
Methode auf den gleichen Bytecode für die test2
Methode produziert? Ich würde erwarten, dass es zumindest die redundante Initialisierung der Variablen result
vermeidet, wenn man bedenkt, dass es leicht ist, zu dem Schluss zu kommen, dass der Wert 100
überhaupt nicht verwendet wird.
Ich beobachtete dies mit beiden Eclipse-Compiler und javac
.
javac
Version: 1.8.0_72
, als Teil des JDK zusammen mit Java installiert ist:
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
Die * Java-Sprachspezifikation * benötigt keine Optimierungen wie diese, daher ist es nicht sinnvoll, über den "Compiler" zu sprechen, als gäbe es nur einen. Sie sollten angeben, welchen Compiler Sie verwenden. – ruakh
Die klassische Antwort ist, dass Optimierungen in der JVM (http://stackoverflow.com/questions/5981460/optimization-by-javacompiler) – wero
@ruakh Gute Bemerkung gemacht werden; Compiler Informationen hinzugefügt. –