Использует ли компилятор Java некоторые преобразования для оптимизации вызовов методов? Или он всегда генерирует точное представление источника с помощью простых оптимизаций, таких как удаление мертвого кода?Оптимизация компилятора вызовов методов
В частности, если мы имеем пример ниже:
public static void main(String[] args) {
System.out.println(foo());
System.out.println(foo());
System.out.println(foo());
System.out.println(bar());
System.out.println(bar());
System.out.println(bar());
}
public static int foo() {
int[] arr = {1, 2, 3, 4};
return arr[0];
}
public static int bar() {
return 10;
}
ли попытка компилятор заменить вызов bar
(или даже, возможно, foo
) с вызовом для печати целое 10
?
public static void main(String[] args) {
System.out.println(1);
System.out.println(1);
System.out.println(1);
System.out.println(10);
System.out.println(10);
System.out.println(10);
}
Я знаю метод называется встраивание, что может привести к таким преобразованиям, но мне было интересно, если компилятор Java (по крайней мере, javac
в Oracle JDK) применяет его, или, если это всегда откладывается до JVM.
Ответ «это зависит». Java имеет [JIT] (http://en.wikipedia.org/wiki/Just-in-time_compilation), а также делает некоторые способы оптимизации при преобразовании источника в байтовый код. Таким образом, в принципе, до тех пор, пока он не изменит наблюдаемое поведение кода, Java может в любой момент сделать любую оптимизацию. – aruisdante
См. Http://stackoverflow.com/questions/2096361/are-there-inline-functions-in-java – aruisdante
И: http://stackoverflow.com/questions/8256202/how-does-the-java-jit -compiler-оптимизируют-мой-код – aruisdante