卡尺:解读基准测试结果

3

有人可以帮我解决这个问题吗?我写了一个简单的基准测试,只包含一个方法。

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) {}
    }
}

对于 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次) … 如何解释这个基准测试的结果?
1个回答

4
百分比只是进度,即之后没有什么有趣的东西。
这些数字(5480.41ns 56579.97ns 553782.25ns)的确切含义是什么。
这是单次迭代的平均持续时间,即timeXXX的持续时间除以repσ=311.51 ns标准差。如果σ/测量时间接近于1,那么可以确定出现了问题。
基准测试=IntArrayBlockingQueue,长度=100
这是基准测试的名称和给定的参数,例如通过@Param

重要部分

不要让你的timeXXX方法返回空值,而是计算并返回一些结果,以确保整个计算过程没有被优化掉。你的方法主体应该如下:

...
while ((value = queue.poll()) != 101) {
    result += value;
}

单个 Integer.getValue() 的加法几乎不会使其变慢,虽然有一点影响,但这样基准测试更加真实(您使用的是轮询值,是吧)。通常你想运行多个基准测试并比较它们的结果,这样可以选择最快的变体(实际上,通常情况下不需要任何基准测试)。
你的循环有些奇怪,不过通常队列中只有一个元素...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接