避免jvm热身

时间:2010-12-03 13:31:20

标签: java sorting 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

4 个答案:

答案 0 :(得分:6)

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

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


this little case study中,JIT编译在1700次调用后启动。

答案 1 :(得分:3)

  

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

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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