6

在编写微基准测试时,可以观察到运行时的巨大差异,具体取决于方法是否已编译。有没有办法从程序中判断特定方法是否已编译?或者,有没有办法请求它,或者知道如何在没有任何额外信息的情况下充分预热它,例如传递给 JVM 的标志?显然,这不一定是完美的(例如,可能存在一些导致 JVM 回退到解释代码的条件),但这肯定是一种改进。

4

2 回答 2

3

对于 Sun/Oracle JVM,您可以使用该-XX:CompileThreshold=1000设置。

这 - 正如官方文档所述 - 定义:

编译前的方法调用/分支数

然后,只需使用该数字来“预热”JVM。

您还可以使用-XX:-PrintCompilationwith-XX:CompileThreshold以便在编译方法时(在控制台中)收到通知。

于 2012-11-17T22:50:24.193 回答
1

我很确定您可以打开日志记录,该日志记录将在方法被 JITCed 时显示。但我不知道从 Java 内部有什么方法可以告诉我。

请记住,JIT 编译不是一个事件,而是一个过程——一个方法可能会被重新编译多次,因为有关其特征的更多信息变得可用。

最后,请注意“热身”在一般情况下是不确定的。虽然您通常可以可靠地“预热”单个方法,但由于许多因素,即使是规模不大的应用程序也更难。

(虽然我不知道为什么无法将读取某种方法的某种 JITC 状态的能力添加到嵌入式调试工具中。)

补充:在对代码“片段”进行基准测试时要注意的一件事是,执行所有循环的最外层方法通常不是 JITC 可用的(取决于 JITC 的实现方式),因为它永远不会返回因此永远不能调用 JITCed 版本。因此,应始终将要进行基准测试的代码的“肉”放在重复调用的单独方法中,而不是将循环和要进行基准测试的代码放在同一方法中。

于 2012-11-17T23:14:30.283 回答