2

我被要求使用 Google 的 Caliper 项目来创建一些微基准测试。我非常想使用最新的 beta 快照的注释功能,但是除了一些小例子之外,我很难找到关于如何实际运行这个东西的好文档……有一个视频教程可以指导用户新的 Maven 集成功能,我也被要求不要使用。

现在我只是从他们的一个中剥离了一个小例子,并用我从另一个 SO 问题中收集到的一些其他信息进行了修改:

public class Benchmarks {

    public class Test {
        @Param int size; // set automatically by framework

        private int[] array; // set by us, in setUp()

        @BeforeExperiment void setUp() {
          // @Param values are guaranteed to have been injected by now
          array = new int[size];
        }

        @Benchmark int timeArrayIteration(int reps) {
            int dummy = 0;
            for (int i = 0; i < reps; i++) {
                for (int doNotIgnoreMe : array) {
                    dummy += doNotIgnoreMe;
                }
            }
          return dummy;
        }

    }

    //(Questionable practice here?)
    public static void main (String args[]) {
        CaliperMain.main(Test.class, args); 
    }

}

运行它会告诉我我没有设置大小的默认值。我无法追踪我应该把它放在哪里。

通过注释掉 @Param 行并为 setUp 中的数组声明赋予硬值来完全删除“大小”只会导致它决定“没有要进行的实验”,我想这是有道理的。

如果有任何最新的资源或教程可以指出我做错了什么(可能很多,老实说)我会非常感激。

编辑:

根据一些建议,我已对此进行了更新:

public class Benchmarks {
      @Param({"1", "10", "1000"}) int size; // set automatically by framework

  private int[] array; // set by us, in setUp()

  @BeforeExperiment void setUp() {
    // @Param values are guaranteed to have been injected by now
    array = new int[size];
  }

  @Benchmark int timeArrayIteration(int reps) {
    int dummy = 0;
    for (int i = 0; i < reps; i++) {
      for (int doNotIgnoreMe : array) {
        dummy += doNotIgnoreMe;
      }
    }
    return dummy;
  }
}

我正在运行 beta 快照并将 Benchmarks 类作为参数传递。我收到以下信息:

Experiment selection: 
  Instruments:   []
  User parameters:   {size=[1, 10, 1000]}
  Virtual machines:  [default]
  Selection type:    Full cartesian product

There were no experiments to be performed for the class Benchmarks using the instruments [allocation, runtime]

它似乎没有检测到任何仪器。我没有传入任何内容,因为它在文档中提到它只是使用默认分配、运行时(这对我的目的来说很好)。

双重编辑:发现了那个问题,愚蠢的错误。一旦我确认它会做一个快速的记录。

4

2 回答 2

0

运行它会告诉我我没有设置大小的默认值。

参数从默认值设置:

@Param({"1", "10", "1000"}) int size;

或者通过-D标志传递值。例如:-Dsize=1,10,1000。枚举和布尔值得到特殊处理,因为它使用所有可能的值,而不必在注释中列出它们。


通过注释掉 @Param 行并为 setUp 中的数组声明赋予硬值来完全删除“大小”只会导致它决定“没有要进行的实验”,我想这是有道理的。

问题很可能是您的基准测试是一个内部类并且需要对封闭类的引用(尽管这应该是一个错误)。要么使您的基准类成为顶级类(推荐),要么使其成为静态的。


此外,没有特别需要包含 main 方法。CaliperMain使用您的基准类作为第一个参数进行调用是等效的。

于 2014-01-17T22:20:43.537 回答
0

运行它会告诉我我没有设置大小的默认值。

这很简单:

@Param({"1", "10", "1000"}) int size;

通过注释掉 @Param 行并为 setUp 中的数组声明赋予硬值来完全删除“大小”只会导致它决定“没有要进行的实验”,我想这是有道理的。

不,它没有。如果没有任何参数,每个基准测试方法将只运行一次。有关解决方案,请参阅其他答案。


有一个相当多的 Javadoc,例如,在@Param. 实际上,并没有太大变化。注释已经取代了约定(现在您不需要time前缀),参数保持不变,安装程序使用注释而不是继承。

于 2014-01-17T21:13:59.710 回答