给出以下代码:
public class MainClass {
public static int f(){
int i=0;
i++;
return i;
}
}
编译器javac生成以下代码:
Compiled from "MainClass.java"
public class latte_jvm.MainClass {
public static int f();
Code:
0: iconst_0
1: istore_0
2: iinc 0, 1
5: iload_0
6: ireturn
}
函数f确实很简单 - 它只返回1.它是如此直接翻译,以至于我很难相信java编译器会进行任何优化。为什么java编译器创建者决定不在编译阶段进行这样的优化?
答案 0 :(得分:17)
如此直接翻译使我很难相信java编译器会进行任何优化。
事实上。大多数Java优化都是在JIT时执行的。 Java维护者很久以前就发现,在很多情况下,在编译时执行的优化实际上阻碍了JIT时更重要的优化。
几年来,-O
命令行参数什么也没做 - 而且非常刻意。
答案 1 :(得分:6)
此外,通过将优化移至JVM,所有基于JVM的语言都可以从中受益。编译器(不仅仅是javac)有一个相对容易的工作;语言发明者不必是优化专家。