Java理论与实践: 动态编译与性能测量 - 编程入门网
度进行了优化,适用于 需要长期运行的服务器应用程序。客户机编译器的优化目标,是减少应用程序的 启动时间和内存消耗,优化的复杂程度远远低于服务器编译器,因此需要的编译 时间也更少。
HotSpot 服务器编译器能够执行各种样的类。它能够执行许多静态编译器中 常见的标准优化,例如代码提升( hoisting)、公共的子表达式清除、循环展开 (unrolling)、范围检测清除、死代码清除、数据流分析,还有各种在静态编译 语言中不实用的优化技术,例如虚方法调用的聚合内联。 Java理论与实践: 动态编译与性能测量(2)时间:2010-12-21 IBM Brian Goetz持续重新编译 HotSpot 技术另一个有趣的方面是:编译不是一个全有或者全无(all-or- nothing)的命题。在解释代码路径一定次数之后,会把它重新编译成机器码。但 是 JVM 会继续进行性能分析,而且如果认为代码路径特别热门,或者未来的性 能分析数据认为存在额外的优化可能,那么还有可能用更高一级的优化重新编译 代码。JVM 在一个应用程序的执行过程中,可能会把相同的字节码重新编译许多 次。为了深入了解编译器做了什么,请用 -XX:+PrintCompilation 标志调用 JVM,这个标志会使编译器(客户机或服务器)每次运行的时候打印一条短消息 。 栈上(On-stack)替换 HotSpot 开始的版本编译的时候每次编译一个方法。如果某个方法的累计执 行次数超过指定的循环迭代次数(在 HotSpot 的第一版中,是 10,000 次), 那么这个方法就被当作热门方法,计算的方式是:为每个方法关联一个计数器, 每次执行一个后向分支时,就会递增计数器一次。但是,在方法编译之后,方法 调用并没有切换到编译的版本,需要退出并重新进入方法,后续调用才会使用编 译的版本。结果就是,在某些情况下,可能永远不会用到编译的版本,例如对于 计算密集型程序,在这类程序中所有的计算都是在方法的一次调用中完成的。重 量级方法可能被编译,但是编译的代码永远用不到。 HotSpot 最近的版本采用了称为 栈上(on-stack)替换 (OSR) 的技术,支持 在循环过程中间,从解释执行切换到编译的代码(或者从编译代码的一个版本切 换到另一个版本)。 那么,这与评测有什么关系? 我向您许诺了一篇关于评测和性能测量的文章,但是迄今为止,您得到的只 是历史的教训和 Sun 的 HotSpot 白皮书的老调重谈。绕这么大的圈子的原因是 ,如果不理解动态编译的过程,就不可能正确地编写或解释 Java 类的性能测试 。(即使深入理解动态编译和 JVM 优化,也仍然是非常困难的。) 为 Java 代码编写微评测远比为 C 代码编写难得多 判断方法 A 是否比方法 B 更快的传统方法,是编写小的评测程序,通常叫 做 微评测。这个趋势非常有意义。科学的方法不能缺少独立的调查。魔鬼总在 细节之中。为动态编译的语言编写并解释评测,远比为静态编译的语言难得多。为了了解某个结构的性能,编写一个使用该结构的程序一点也没有错,但是在许 多情况下,用 Java 编写的微评测告诉您的,往往与您所认为的不一样。 使用 C 程序时,您甚至不用运行它,就能了解许多程序可能的性能特征。只 要看看编译出的机器码就可以了。编译器生成的指令就是将要执行的机器码,一 般情况下,可以很合理地理解它们的时间特征。(有许多有毛病的例子,因为总 是遗漏分支预测或缓存,所以性能差的程度远远超过查看机器码所能够想像的程 度,但是大多数情况下,您都可以通过查看机器码了解 C 程序的性能的很多方 面。) 如果编译器认为某段代码不恰当,准备把它优化掉(通常的情况是,评测到 它实际上不做任何事情),那么您在生成的机器码中可以看到这个优化 —— 代 码不在那儿了。通常,对于 C 代码,您不必执行很长时间,就可以对它的性能 做出 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |