Ho una semplice classe per gli scopi illustrativi:Perché il compilatore Java non sta ottimizzando un metodo banale?
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
Il bytecode generato dal compilatore (ispezionati da javap -c Test.class
) è la seguente:
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
Perché il compilatore non ottimizzando la test1
metodo per lo stesso bytecode prodotto per il metodo test2
? Mi aspetto che almeno eviti l'inizializzazione ridondante della variabile result
considerando che è facile concludere che il valore 100
non viene utilizzato affatto.
Ho osservato questo con entrambi il compilatore Eclipse e javac
. Versione
javac
: 1.8.0_72
, installato come parte del JDK insieme a Java:
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
Il * Java Language Specification * non richiede alcuna ottimizzazione come questa, quindi non è significativo parlare di "compilatore" come se ce ne fosse solo uno. Dovresti indicare quale compilatore stai usando. – ruakh
la risposta classica è che le ottimizzazioni vengono eseguite nella JVM (http://stackoverflow.com/questions/5981460/optimization-by-java-compiler) – wero
@ruakh Buona osservazione; aggiunto informazioni sul compilatore. –