【问题标题】:What is the purpose of JMH @Fork?JMH @Fork 的目的是什么?
【发布时间】:2016-05-04 23:00:07
【问题描述】:

如果 IIUC 每个分叉创建一个单独的虚拟机,因为每个虚拟机实例运行时 JIT 指令可能略有不同?

我也很好奇下面注解中时间属性的作用:

@Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)

TIA, 奥莱

【问题讨论】:

  • 我认为这回答了你的问题:stackoverflow.com/questions/25572778/…
  • 所以 IIUC,每个 fork 都在单独的 VM 中运行。我们这样做是因为每个启动的 VM 可能存在细微的差异,这会导致运行时不同,因此我们可以考虑方差计算吗?
  • 是的,每次运行的 JIT 行为方式可能存在差异,因此分叉允许考虑这一点。在运行基准测试时,我看到了非常奇怪的情况,其中一次运行会有一定的平均值,而另一次运行相同的测试会有非常不同的平均值,“简单地说”是因为 JIT 处理事情的方式不同。
  • 很好 - 很高兴知道 - 谢谢 Tunaki。顺便说一句 - 如果您想将其添加为答案,我认为该答案比参考要清晰得多。

标签: java benchmarking jmh


【解决方案1】:

JMH 提供 fork 功能有几个原因。一种是上面 Rafael 所讨论的编译配置文件分离。但是这种行为不受 @Forks 注释的控制(除非您选择 0 个分叉,这意味着根本不会分叉任何子进程来运行基准测试)。您可以通过使用预热模式控制 (-wm) 选择运行所有基准作为基准预热的一部分(从而为 JIT 创建混合配置文件)。

现实情况是,许多事情都可能使您的结果以一种或另一种方式倾斜,并且多次运行任何基准以建立运行间差异是 JMH 支持的重要实践(大多数手动框架不支持)帮助)。运行差异的原因可能包括(但我相信还有更多):

  • CPU 在某个 C 状态下启动,并在面临负载时提高频率,然后过热并降低频率。您可以在某些操作系统上控制此问题。

  • 进程的内存对齐可能会导致分页行为差异。

  • 后台应用活动。
  • 操作系统分配的 CPU 会有所不同,从而导致每次运行使用不同的 CPU 集。
  • 页面缓存内容和交换
  • JIT 编译是同时触发的,可能会导致不同的结果(这往往会在测试大量代码时发生)。请注意,小型单线程基准测试通常不会出现此问题。
  • GC 行为可能会在每次运行的时间略有不同时触发,从而导致不同的结果。

至少使用几个分叉运行您的基准测试将有助于消除这些差异,并让您了解您在基准测试中看到的运行与运行差异。我建议您从默认值 10 开始,然后根据您的基准测试将其减少(或增加)。

【讨论】:

    【解决方案2】:

    JVM 通过创建应用程序行为的配置文件来优化应用程序。创建分叉以重置此配置文件。否则,运行:

    benchmarkFoo();
    benchmarkBar();
    

    可能会导致不同的测量结果

    benchmarkBar();
    benchmarkFoo();
    

    因为第一个基准的配置文件会影响第二个。

    时间决定了 JMH 为预热或运行基准测试所花费的时间。如果这些时间过短,您的 VM 可能没有充分预热,或者您的结果可能具有过高的标准偏差。

    【讨论】:

      【解决方案3】:

      更新:

      JMH(Java Microbenchmark Harness),已添加到 JDK 从 JDK 12 开始。

      @Fork 注释,指示基准如何执行。value 参数控制基准将执行多少次,warmup 参数控制在收集结果之前基准将干运行多少次。

      示例:

      @Benchmark
      @Fork(value = 1, warmups = 3)
      @BenchmarkMode(Mode.AverageTime)
      public void myMethod() {
          // Do nothing
      }
      

      这会指示 JMH 在进行 实时基准测试之前运行三个预热分支并丢弃结果

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 1970-01-01
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多