如何在没有maven的情况下使用Caliper基准beta测试快照?

时间:2014-01-17 18:25:33

标签: java microbenchmark caliper

我被要求使用Google的Caliper项目来创建一些微基准测试。我非常想使用最新测试版快照的注释功能,但除了一些小例子之外,我无法找到关于如何实际运行该事物的良好文档......有一个视频教程可以指导用户新的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); 
    }

}

运行它给我的消息是我没有为size设置默认值。我无法追踪我应该放在哪里。

删除&#34;尺寸&#34;完全通过注释掉@Param线并给setUp中的数组声明赋予一个硬值,只是导致它决定是否存在&#34;没有实验要做,&#34;我认为这是有道理的。

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

编辑:

我根据一些建议更新了这个:

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;
  }
}

我正在浏览测试版快照并传入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]

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

DOUBLE EDIT:发现那个问题,愚蠢的错误。一旦我确认,我会做快速的写作。

2 个答案:

答案 0 :(得分:0)

  

运行它会给我一条消息,我没有为size设置默认值。

这非常简单:

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

  

删除&#34;尺寸&#34;完全通过注释掉@Param线并给setUp中的数组声明赋予一个硬值,只是导致它决定是否存在&#34;没有实验要做,&#34;这是有道理的,我想。

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


例如@Param上有一些Javadoc。实际上,并没有改变。注释已经取代了约定(现在你不需要time前缀),params保持不变,setup使用注释而不是继承。

答案 1 :(得分:0)

  

运行它会给我一条消息,我没有为size设置默认值。

参数可以通过默认值设置:

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

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


  

通过注释@Param线并给setUp中的数组声明赋予硬值来完全删除“size”只会导致它决定“没有实验要做”,这是有道理的,我想。 / p>

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


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