Java虚拟机JVM性能优化(二):编译器(5)
展开循环体: 减少循环条件的检测次数和跳转次数。你可以把这想象成将几次迭代“内嵌”执行,而不必进行条件检测。循环体展开也会带来一定的风险,因为它可能因为影响流水线和大量的冗余指令提取而降低性能。再一次,是否展开循环体由编译器在运行时决定,如果能带来更大的性能提升则值得展开。
以上就是对编译器在字节码级别(或更低级别)如何改进应用程序在目标平台执行性能的一个概述。我们所讨论的都是些常见、流行的优化方式。由于篇幅有限我们只举了一些简单的例子。我们的目的是希望通过上面简单的讨论来激起你深入研究优化的兴趣。
结论:反思点和重点
根据不同的目的,选择不同的编译器。
1.解释器是将字节码翻译成机器指令的最简单形式。它的实现基于一个指令查询表。
2.编译器可以基于性能计数器进行优化,但是需要消耗一些额外的资源(代码缓存,优化线程等)。
3.客户端编译器相对于解释器可以带来5到10倍的性能提升。
4.服务器端编译器相对于客户端编译器来说可以带来30%到50%的性能提升,但需要消耗更多的资源。
5.多层编译则综合了两者的优点。使用客户端编译来获取更快的响应速度,接着使用服务器端编译器来优化那些被频繁调用的代码。
这里有很多种可能的代码优化方式。编译器的一个重要工作就是分析所有可能的优化方式,然后对各种优化方式所付出的代价与最终得到的机器指令带来的性能提升进行权衡。