如果编译器认为某段代码不恰当,准备把它优化掉(通常的情况是,评测到它实际上不做任何事情),那么您在生成的机器码中可以看到这个优化 代码不在那儿了。通常,对于 C 代码,您不必执行很长时间,就可以对它的性能做出合理的推断。
而在另一方面,HotSpot JIT 在程序运行时会持续地把 Java 字节码重新编译成机器码,而重新编译触发的次数无法预期,触发重新编译的依据是性能分析数据积累到一定数量、装入新类,或者执行到的代码路径的类已经装入,但是还没有执行过。持续的重新编译情况下的时间测量会非常混乱、让人误解,而且要想获得有用的性能数据,通常必须让 Java 代码运行相当长的时间(我曾经看到过一些怪事,在程序启动运行之后要加速几个小时甚至数天),才能获得有用的性能数据。
清除死代码
编写好评测的一个挑战就是,优化编译器要擅长找出死代码 对于程序执行的输出没有作用的代码。但是评测程序一般不产生任何输出,这就意味着有一些,