任何人都可以帮我解决这个问题。 我用单一方法编写简单的基准
public void timeIntArrayBlockingQueue(int reps) {
for (int i = 0; i < reps; i++) {
for (int j = 0; j < length; j++)
queue.add(data[j]);
Integer value;
while ((value = queue.poll()) != 101) {}
}
}
for ArrayBlockingQueue并获得结果:
0% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=100} 5480.41 ns; σ=311.51 ns @ 10 trials
33% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=1000} 56579.97 ns; σ=5530.23 ns @ 10 trials
67% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=10000} 553782.25 ns; σ=27212.56 ns @ 10 trials
length us linear runtime
100 5.48 =
1000 56.58 ===
10000 553.78 ==============================
vm: java
trial: 0
benchmark: IntArrayBlockingQueue
这个数字(5480.41ns 56579.97ns 553782.25ns)究竟是什么意思。
0%场景方法timeIntArrayBlockingQueue被调用10次,参数长度= 100。 (timeIntArrayBlockingQueue(100) - 10次)
33%场景方法timeIntArrayBlockingQueue被调用10次,参数长度= 1000。 (timeIntArrayBlockingQueue(1000) - 10次) 。 。
如何解释此基准测试的结果?
答案 0 :(得分:4)
百分比只是进步,即之后没什么有趣的。
这个数字(5480.41ns 56579.97ns 553782.25ns)究竟是什么意思。
这是单次迭代的平均持续时间,即timeXXX
的持续时间除以rep
。
σ=311.51 ns
是Standard deviation。排序绝对错误,如果σ/measured_time
接近1,你可以确定这是错误的。
benchmark = IntArrayBlockingQueue,长度= 100
基准的名称是给定的参数,例如:通过@Param
。
不要让timeXXX
方法返回任何内容,而是计算并返回一些结果,以便您可以确定整个计算不会被优化掉。你方法的主体应该是
...
while ((value = queue.poll()) != 101) {
result += value;
}
单一添加与Integer.getValue()
一起使用几乎不会慢得多。它做了一点,但基准测试通过这种方式变得更加真实(你使用轮询值,不是吗)。通常,您希望运行多个基准测试并比较其结果,以便您可以选择最快的变体(实际上,通常您不需要任何基准测试)。
你循环很奇怪,无论如何,队列中通常只有一个元素......