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

JMH的不对称基准

锺宜
2023-03-14

我正在使用JMH对自定义集合实现进行性能测试。

我想模仿一个场景,其中读取次数比写入次数大10倍。

我使用了这个非对称基准测试示例,并创建了一个包含10个读取线程和1个写入线程的组:

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Group("g0")
@GroupThreads(1)       
public void baselinePut0(CacheState0 state) { writing }

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Group("g0")
@GroupThreads(10)
public Integer baselineGet0(CacheState0 state) { reading }

我使用-wi 10-i 10-f 1参数运行测试。在报告中,变量cnt对所有基准测试都是相同的:

Benchmark                  Mode  Cnt     Score      Error  Units
Benchmark.g0               avgt   10   262,537 ?  215,406  us/op
Benchmark.g0:baselineGet0  avgt   10     2,101 ?    0,154  us/op
Benchmark.g0:baselinePut0  avgt   10  1252,231 ?  697,807  us/op

这是否意味着实验中的读取次数等于写入次数?如果有,如何正确实施?更一般的问题是:我在这个设置中遗漏了什么吗?

共有1个答案

秦才
2023-03-14

Cnt显示样本数(不是线程数)。在您的情况下是10,因为您使用-i 10运行测试。如果您在所有参数都设置为唯一值的情况下运行此参数,则更容易看到此参数不是线程数(例如-i 13,而@GroupThread(10)保持不变)

您还可以(临时)将输出行添加到您的测试中,并查看每个线程的来源,例如对于阅读器(以及类似于带有“作家”一词的作家):

System.out.println("reader " + Thread.currentThread().getName());
 类似资料:
  • 我使用JMH对DOM解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 有人能解释为什么会这样吗?此外,百分位数和所有数字意味着什么?为什么在第三次迭代后它开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

  • 受另一个关于堆栈溢出的问题的启发,我编写了一个微型基准来检查,什么更有效: 有条件地检查零除数或 捕获和处理 下面是我的代码: 我对JMH完全陌生,不确定代码是否正确。 我的基准是正确的吗?你看到任何错误吗? 旁白:请不要建议询问https://codereview.stackexchange.com.对于Codereview,代码必须已按预期工作。我不确定这个基准是否能按预期工作。

  • 我正在使用向服务器发送REST请求的自定义Java库为HTTP服务器编写性能测试。在开始时,我正在执行数据准备阶段,以便获得一个要向服务器发送请求的对象列表。 现在,问题是,我可以使用注释测试可以注入基准函数的参数列表: 问题是,我希望通过Java参数列表实现同样的效果,并避免对它们进行迭代。你能告诉我怎么做吗?

  • 我通过JMH进行了一些基准测试 假设我在一个Java文件中列出了三个基准测试 每种方法都对服务于相同目的的不同算法进行基准测试。当我一起运行所有基准测试时,与逐个运行基准测试相比,结果会有所不同。 例如,在Java文件上仅使用onw基准执行JMH运行。 如果只运行此方法,此方法的结果会更好,但是如果使用更多基准,结果会更差。 假设基于结果的基准测试 我还尝试改变基准的顺序(按字典顺序执行),结果是

  • 问题内容: 我有一个构造一些复杂数据的类(想象一个大的XML或JSON结构- 这样的事情)。建造它需要时间。所以我想构造一次,然后在所有测试中使用相同的数据。目前,我基本上在一个定义了class的类中定义了一个对象实例,然后在测试中显式引用它(代码是一个非常简化的示例): 当然这太糟糕了……同样邪恶的选择是创建一个单独的类,以便它可以容纳单个静态对象。使用类似的东西会很好 但只接受字符串,因此不确

  • 我是JMH的新手。在运行代码并使用不同的注释之后,我真的不明白它是如何工作的。我使用迭代=1、预热=1、fork=1来查看我的代码将执行一次,但事实并非如此。JMH运行我的代码超过100000次,我不知道为什么。那么,如何控制代码调用的时间?下面是我的代码:(我为测试修复了JMHSample\u 01)