JMH中的不对称基准

时间:2016-01-05 18:11:17

标签: java benchmarking jmh

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

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

我使用了this非对称基准测试示例并创建了一个包含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 个答案:

答案 0 :(得分:1)

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

您还可以(临时)将输出行添加到测试中,并查看每个线程的来源,例如:对于读者来说(类似于作者用词"作家"):

System.out.println("reader " + Thread.currentThread().getName());