动态编译与性能测量--动态编译情况下指标评测的风险(二)

2014-11-23 23:22:36 · 作者: · 浏览: 1
序时,您甚至不用运行它,就能了解许多程序可能的性能特征。只要看看编译出的机器码就可以了。编译器生成的指令就是将要执行的机器码,一般情况下,可以很合理地理解它们的时间特征。(有许多有毛病的例子,因为总是遗漏分支预测或缓存,所以性能差的程度远远超过查看机器码所能够想像的程度,但是大多数情况下,您都可以通过查看机器码了解 C 程序的性能的很多方面。)

如果编译器认为某段代码不恰当,准备把它优化掉(通常的情况是,评测到它实际上不做任何事情),那么您在生成的机器码中可以看到这个优化 代码不在那儿了。通常,对于 C 代码,您不必执行很长时间,就可以对它的性能做出合理的推断。

而在另一方面,HotSpot JIT 在程序运行时会持续地把 Java 字节码重新编译成机器码,而重新编译触发的次数无法预期,触发重新编译的依据是性能分析数据积累到一定数量、装入新类,或者执行到的代码路径的类已经装入,但是还没有执行过。持续的重新编译情况下的时间测量会非常混乱、让人误解,而且要想获得有用的性能数据,通常必须让 Java 代码运行相当长的时间(我曾经看到过一些怪事,在程序启动运行之后要加速几个小时甚至数天),才能获得有用的性能数据。

清除死代码
编写好评测的一个挑战就是,优化编译器要擅长找出死代码 对于程序执行的输出没有作用的代码。但是评测程序一般不产生任何输出,这就意味着有一些,