我正在使用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
这是否意味着读取次数等于实验中的写入次数?如果是这样,如何正确实现?更一般的是:我在这个设置中遗漏了什么吗?
答案 0 :(得分:1)
Cnt
显示样本数(不是线程数)。在您的情况下,它是10,因为您正在使用-i 10
运行测试。如果您运行该参数并将所有参数设置为唯一值(例如-i 13
,而@GroupThreads(10)
保持不变),则会更容易看到此参数不是线程数。
您还可以(临时)将输出行添加到测试中,并查看每个线程的来源,例如:对于读者来说(类似于作者用词"作家"):
System.out.println("reader " + Thread.currentThread().getName());