根据文档上,据我所知,Blackhole#consume(Object obj)
是用来防止死代码消除使用JMH基准爪哇时。在ArrayList对象上调用consume
与遍历列表并在每个元素上调用consume
之间在行为上有区别吗?
例如,以下两个代码示例之间的行为是否会有所不同:
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void someBenchmarkMethod(Blackhole blackhole) {
List<Integer> ret = //some method that we're benchmarking that returns a list
blackhole.consume(ret);
}
和
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void someBenchmarkMethod(Blackhole blackhole) {
List<Integer> ret = //some method that we're benchmarking that returns a list
for (Integer i : ret) {
blackhole.consume(i);
}
}
一个比另一个更准确(或变量更少)吗?