为什么javac不优化甚至简单的代码?
给出以下代码:
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编译器创建者决定不在编译阶段进行这样的优化?
如此直接翻译使我很难相信java编译器会进行任何优化。
确实。 大多数Java优化都是在JIT时执行的。 Java维护者很久以前就发现,在很多情况下,在编译时执行的优化实际上阻碍了JIT时间更重要的优化。
几年来, -O
命令行参数没有做任何事情 – 而且非常刻意。
此外,通过将优化移至JVM,所有基于JVM的语言都可以从中受益。 编译器(不仅仅是javac)有一个相对容易的工作; 语言发明者不必是优化专家。