【问题标题】:Avoid jvm warmup避免 jvm 预热
【发布时间】:2010-12-03 13:31:19
【问题描述】:

如果我正在设计排序算法测试,我可以这样做以避免 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

【问题讨论】:

  • 您是否仍在尝试对 5,000 个元素的排序进行基准测试,或者您是否决定遵循上一个问题中给出的建议?如果您决定遵循该建议,您应该接受其中一个答案。

标签: java sorting jvm


【解决方案1】:

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

但是,您应该知道,即使您这样做,也无法保证。您必须对您的特定 JVM 进行试验,以确定在重要部分被 JIT 等之前您需要做多少工作。


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

【讨论】:

  • 嗯。但如果循环实际上正在运行排序测试?!
  • 啊,对不起。我没有意识到您实际上在初始循环中运行了测试。是的,这应该会更好。我会更新我的答案。
  • @aioobe JMH 执行预热迭代。热身迭代的真正含义是什么?是预热代码所需的操作量吗?
【解决方案2】:

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

先有点迂腐。您不应该避免 JVM 预热。它需要发生。您要做的是防止 JVM 预热扭曲您的基准测试结果。

要回答您的问题,该方法大致正确,但很难预测您需要在初始循环中进行多少次测试。它可能取决于测试代码、JVM 版本和 JVM 调优参数……可能还有其他因素。

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

【讨论】:

    【解决方案3】:

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

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

    2) 确保在长时间热身后长时间运行测试。如果可能的话,在同样长时间的预热之后,30 秒是实际测量周期的最低限度。例如SPECjbb等。每次迭代运行几分钟,进行多次迭代。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多