当前位置: 首页 > 知识库问答 >
问题:

JMH@Fork的目的是什么?

长孙鸿振
2023-03-14

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

我也很好奇时间属性在下面的注释中有什么作用:

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

蒂亚,奥莱

共有3个答案

吉嘉珍
2023-03-14

更新:

JMH(Java 微基准线束)已从 JDK 12 开始添加到 JDK 中。

< code>@Fork注释指示如何执行基准测试,< code>value参数控制基准测试的执行次数,而< code>warmup参数控制在收集结果之前基准测试的试运行次数。

例子:

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

这指示JMH运行三个预热分叉并在进入真正的定时基准测试之前丢弃结果。

嵇丰
2023-03-14

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

benchmarkFoo();
benchmarkBar();

可能导致的测量结果与

benchmarkBar();
benchmarkFoo();

因为第一个基准的情况会影响第二个基准。

《纽约时报》决定了JMH为预热或运行基准所花费的时间。如果这些时间太短,您的虚拟机可能没有充分预热,或者您的结果可能具有太高的标准偏差。

翟功
2023-03-14

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

现实情况是,许多事情可能会以某种方式扭曲你的结果,并且多次运行任何基准测试以建立运行到运行的差异是JMH支持的重要实践(大多数手动滚动的框架都无济于事)。运行到运行差异的原因可能包括(但我相信还有更多):

>

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

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

    用至少几个分支运行你的基准测试将有助于消除这些差异,并让你了解你在基准测试中看到的运行到运行的差异。我建议你从默认的10开始,根据你的基准测试,通过实验减少(或增加)它。

  •  类似资料:
    • 我一直在研究jmh实现“多线程”基准测试的方式。根据我的理解,和注释允许并行运行同一组中的基准测试。 使用CPU监视器,我得到两个CPU已完全使用。我想知道跑步者是如何解释这些注释的。

    • 我不明白JMH结果的分数属性?我也没在网上找到任何关于它的东西。 有人能告诉我,这是关于什么的吗?据我所知,高分比低分好,但这到底是什么意思,是如何计算的?

    • 在 jmh 结果中,分数以 ns/op 为单位,即每次操作所花费的时间(以纳秒为单位),操作是否是指基准测试调用?如果是这种情况,较低的分数将意味着更快的呼叫?

    • 问题内容: 如果可能,如何举例说明如何实现JNDI的用法? 问题答案: JNDI是Java命名和目录接口。它用于分离应用程序 开发人员 和应用程序 部署 人员 的关注点。在编写依赖于数据库的应用程序时,无需担心用于连接该数据库的用户名或密码。JNDI允许开发人员为数据库命名,并依靠部署者将该名称映射到数据库的实际实例。 例如,如果您要编写在Java EE容器中运行的代码,则可以编写此代码来获取JN

    • 问题内容: 我正在阅读angular2引用,发现了这个。我想知道以下参数是什么意思? 问题答案: 该文件对应于TypeScript编译器(tsc)的配置。 这些链接可以为您提供有关这些属性的详细信息: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html http://json.schemastore.org/tsconfig

    • 问题内容: 在Python 3.3中,向该模块添加了一个类: 提供ChainChain类,用于快速链接许多映射,因此可以将它们视为一个单元。它通常比创建新字典并运行多个update()调用要快得多。 例: 它是由动机这个问题,并予以公布的这一个(没有创建)。 据我了解,它是拥有额外字典并使用s进行维护的替代方法。 问题是: 涵盖了哪些用例? 有现实世界的例子吗? 是否在切换到python3的第三方