gpt4 book ai didi

java - JMH @Fork 的目的是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:54 26 4
gpt4 key购买 nike

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

我也很好奇时间属性在下面的注释中做了什么:

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

TIA,奥莱

最佳答案

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

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

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

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

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

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

关于java - JMH @Fork 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com