避免jvm热身

如果我正在设计排序算法测试,我可以这样做以避免JVM热身吗? 谢谢!

double count = 0; double start, end; for(int r = 0; r < warmup; r++) { // do test } for(int t = 0; t < runs; t++){ start = System.nanoTime(); // do test end = System.nanoTime(); count += start - end; } double avg = count/avg 

JVM预热通常是指JVM查找热点和JIT代码的这些部分所花费的时间。 如果你运行你的实际测试几百(实际上我相信几千)次你应该相当不错。

但是你应该知道,即使你这样做,也没有保证。 您必须尝试使用​​特定的JVM来确定在重要部件被JIT之前需要做多少工作等等。


在这个小案例研究中 ,JIT编译在1700次调用后启动。

如果我正在设计排序算法测试,我可以这样做以避免JVM热身吗?

一些迂腐第一。 你不应该避免 JVM热身。 它需要发生。 您要做的是防止JVM热身扭曲您的基准测试结果。

要回答您的问题,该方法大致正确,但很难预测您需要在初始循环中进行多少次测试。 它可能依赖于测试代码,JVM版本和JVM调优参数……以及其他可能的东西。

我通常做的只是打印原始时序,过滤掉“看起来具有”眼睛exception时间值的初始“热身”迭代,然后手动计算平均值。 它很笨重,但它给了我一些信心,我已经考虑到热身和其他可能的exception来源。

这是一个非常大的领域,但这里有几个提示:

1)确保您的FULL测试(包括迭代循环)位于重复调用的子例程中。 所以你的测试在“父”方法中有for()循环。 把它推到一个“孩子”并反复调用它。 这允许各种JIT技术真正进行全面优化,而无需进行机上代码替换( 动态循环传输等)。

2)确保测试在长时间预热后运行很长时间。 如果可能的话,经过同样长时间的预热后,30s在实际测量期间是最小的。 例如,SPECjbb等每次迭代运行几分钟,进行多次迭代。

是。 由于预热循环运行实际测试,这意味着所有类等都将被加载并且应该运行JIT编译。