我想为几个映射实现编写一个基准,包括一个自定义实现。我想测试它在广泛的输入上的平均表现。在一个基准测试中使用宽范围输入
由于这是我第一次使用JMH,使用@Param看起来很明显的选择。但事实证明,JMH不会在单个基准测试中使用所有这些不同的输入,但会为每组参数单独运行基准测试。
是否有一些功能应该用于它,我错过了或者只是循环输入我想在基准测试中选择的范围内的正确选项?
更新:
我实现了2个不同的基准,即给予完全相反的比较结果(注:这是特殊的地图(没有实现Map接口)使用三维坐标键)。
在基准
@Benchmark public void benchmarkGet(Blackhole bh){ //8*20 different starting positions for(int i = 0;i < 8 * 20;i++){ for(int x = 0;x < 20;x++){ for(int y = 0;y < 20;y++){ for(int z = 0;z < 20;z++){ Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2])); bh.consume(value); } } } } }
获得每次只有1值,并使用状态得到不同的值,每次循环执行的输入的范围:
@Benchmark @OutputTimeUnit(value = TimeUnit.MICROSECONDS) public void benchmarkGet(Blackhole bh) { Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2])); bh.consume(value); x++; if (x > 20) { y++; x = 0; if (y > 20) { z++; y = 0; if (z > 20) { i++; z = 0; if (i >= 8*20) { i = 0; } } } } }
哪一个是正确的?
pls显示一些代码 – dit
注意:这也是类似于这个问题:http://stackoverflow.com/questions/24496949/benchmarking-java-hashmap-get-jmh-vs-looping但它不回答我的问题:什么是正确的方式,我应该信任哪一个? – Barteks2x