【问题标题】:Caliper: Interpreting the benchmark results卡尺:解释基准测试结果
【发布时间】:2013-04-27 23:15:56
【问题描述】:

谁能帮我解答这个问题。 我用单一方法编写简单的基准测试

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 次) . .

如何解释这个基准的结果?

【问题讨论】:

    标签: java caliper


    【解决方案1】:

    百分比只是进度,即之后没有什么有趣的事情。

    这些数字 (5480.41ns 56579.97ns 553782.25ns) 的确切含义。

    这是单次迭代的平均持续时间,即timeXXX的持续时间除以rep

    σ=311.51 nsStandard deviation。绝对错误,如果σ/measured_time 接近于 1,您可以确定这是错误的。

    benchmark=IntArrayBlockingQueue,长度=100

    这是基准的名称是给定的参数,例如通过@Param


    重要的部分

    不要让你的timeXXX 方法什么都不返回,而是计算并返回一些结果,这样你就可以确定不是整个计算都被优化了。你方法的主体应该是这样的

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

    单次加法加上Integer.getValue() 几乎不能让它变慢。它确实有点,但基准测试以这种方式变得更加现实(你使用轮询值,不是吗)。通常您希望运行多个基准测试并比较它们的结果,以便选择最快的变体(实际上,通常您不需要任何基准测试)。

    你的循环很奇怪,反正队列中通常只有一个元素...

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      相关资源
      最近更新 更多