Jon*_*eet 82
javac 只会做很少的优化,如果有的话.
关键是JIT编译器完成了大部分优化 - 如果它有大量信息,它会工作得最好,如果javac执行优化,其中一些信息可能会丢失.如果javac执行某种循环展开,JIT就会更难以一般方式执行此操作 - 并且它有更多关于哪些优化将实际起作用的信息,因为它知道目标平台.
Sim*_*son 26
到达本节时我停止阅读:
更重要的是,javac编译器不执行简单的优化,如循环展开,代数简化,强度降低等.为了获得这些好处和其他简单的优化,程序员必须在Java源代码上执行它们,而不是依靠javac编译器来执行它们.
首先,在Java源代码上进行循环展开几乎不是一个好主意.javac优化方式没有做太多的原因是它由JVM中的JIT编译器完成,它可以做出更好的编译器决策,因为它可以确切地看到哪些代码运行得最多.
man*_*uti 16
所述javac编译器一次支持的选项,通过传递来生成优化代码-o在命令行上.
无论如何启动J2SE1.3,HotSpot JVM随该平台一起提供,该平台引入了动态技术,例如即时编译和公共执行路径的自适应优化.因此,-o启动此版本的Java编译器忽略了它.
在阅读Ant javac任务及其optimize属性时,我遇到了这个标志:
指示是否应使用优化编译源; 默认为
off.请注意,Sunjavac从JDK 1.3开始忽略了这个标志(因为不需要编译时优化).
此页面中提到了HotSpot JVM的动态优化优于编译时优化的优点:
Server VM包含一个高级自适应编译器,它支持通过优化C++编译器执行的许多相同类型的优化,以及传统编译器无法完成的一些优化,例如跨虚拟方法调用的积极内联.与静态编译器相比,这是一种竞争优势和性能优势.自适应优化技术的方法非常灵活,通常甚至优于高级静态分析和编译技术.
我过去研究过输出的Java字节码(使用名为FrontEnd的应用程序).除了内联常量(静态韵母)和预先计算的固定表达式(如2*5和"ab"+"cd")之外,它基本上不做任何优化.这是为什么如此容易拆解(使用名为JAD的应用程序)的一部分
我还发现了一些有趣的点来优化你的java代码.它帮助我提高了内循环的速度2.5倍.
一个方法有5个快速访问变量.当调用这些变量时,它们比所有其他变量更快(可能是因为堆栈维护).方法的参数也计入这些5.因此,如果你的for循环中的代码执行了一百万次,那么在方法的开头分配这些变量,并且没有参数.
局部变量也比字段快,因此如果在内部循环中使用字段,则通过在方法开头将它们分配给局部变量来缓存这些变量.缓存引用而不是内容.(如:int [] px = this.pixels;)