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

为什么JMH运行不同的分叉?

彭允晨
2023-03-14

我使用http://openjdk.java.net/projects/code-tools/jmh/的JMH基准框架对我的代码进行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃由JVM在执行期间执行的实时(JIT)分析建立的任何概要文件

我理解为什么这在某些情况下是有用的,比如下面(逐字复制自http://Java-performance . info/jmh/):

默认情况下,JHM为每个试验(一组迭代)分叉一个新的java进程。这是保护测试免受先前收集的“配置文件”(关于其他加载类及其执行信息的信息)影响所必需的。例如,如果您有两个类实现了相同的接口并测试了它们两个的性能,那么第一个实现(按测试顺序)可能比第二个实现(在同一个JVM中)快,因为JIT在发现第二个实现后,用接口方法调用替换了对第一个实现的直接方法调用。

但是,在重复对相同代码进行基准测试的情况下,运行 10 个分叉(每次 20 次迭代)而不是 1 个分叉(每次 200 次迭代)有什么好处吗?

非常感谢,

丹尼

共有1个答案

郭俊拔
2023-03-14

有些人坚持认为,使用分叉解决的另一个问题是运行间差异:http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_13_RunToRun.java

但是,任何认真的工程师都必须能够对基准测试环境进行充分的控制,以消除运行之间的任何差异。令人沮丧的是,人们使用分叉来克服他们的懒惰或对他们的基准实际执行方式缺乏了解。

 类似资料:
  • 问题内容: 我正在使用JMH基准测试框架(http://openjdk.java.net/projects/code- tools/jmh/ )在我的代码上运行基准测试。我的理解是,JMH在基准测试期间多次分叉JVM,以便丢弃由JVM在执行期间进行的即时(JIT)分析所建立的任何概要文件。 我了解为什么在某些情况下(例如,下面的情况(从http://java-performance.info/jm

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

  • 问题内容: 我们可以使用docker拉取不同的图像。而且这些映像是不同的linux发行版。但是,无论运行在哪个linux distro docker上,docker都可以像在虚拟机中一样运行这些不同的linux发行版。 我知道docker使用aufs来控制不同的读写访问级别。因此它可以重用主机上的某些文件。但是当主机运行时,docker如何在容器中运行?图像是否包含二进制文件?但是,不同的Linu

  • 这是我的第一个JMH基准测试。我可能做错了一切,但是... 我的基准看起来是这样的 是我开始的...等了又等,然后杀了它。我怀疑在< code>@Setup中有问题,所以我简化了它,但是什么都没有改变。这场赛跑开始时相当乐观... 然后什么都没发生。过了很长时间,它继续写下20行像 和5行像 然后它输出一些结果 并更正其估计的eta: 我的是否比我想象的更频繁地被调用,或者还有什么其他原因导致了缓

  • 问题内容: 我一直认为,在实现Runnable的java类中同步run方法是多余的。 我试图弄清楚为什么人们这样做: 这似乎是多余且不必要的,因为它们正在为另一个线程获取对象的锁。更确切地说,他们明确指出只有一个线程可以访问run()方法。但是由于它是run方法,它本身不是自己的线程吗?因此,只有它可以访问自身,并且不需要单独的锁定机制? 我在网上找到了一个建议,即通过同步运行方法,您可以通过以下