У меня есть простой класс для целей иллюстрации:Почему компилятор Java не оптимизирует тривиальный метод?
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
Байткод производится компилятором (проверяемого на javap -c Test.class
) заключается в следующем:
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
Почему компилятор не оптимизируя test1
метод для того же байт-кода, созданного для метода test2
? Я ожидал бы, по крайней мере, избежать избыточной инициализации переменной result
, учитывая, что легко сделать вывод, что значение 100
вообще не используется.
Я наблюдал это как с компилятором Eclipse, так и с javac
. версия
javac
: 1.8.0_72
, устанавливается как часть JDK вместе с 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)
* Спецификация языка Java * не требует таких оптимизаций, поэтому не имеет смысла говорить о «компиляторе», как если бы он был только одним. Вы должны указать, какой компилятор вы используете. – ruakh
классический ответ: оптимизация выполняется в JVM (http://stackoverflow.com/questions/5981460/optimization-by-java-compiler) – wero
@ruakh Хорошее замечание; добавлена информация о компиляторе. –