【问题标题】:How to use Caliper benchmark beta snapshot without maven?如何在没有 maven 的情况下使用 Caliper 基准测试版快照?
【发布时间】:2014-02-07 05:03:42
【问题描述】:

我被要求使用 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;
  }
}

我正在运行测试版快照并将 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]

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

双重编辑:发现了那个问题,愚蠢的错误。确认后会快速撰写。

【问题讨论】:

  • 任何提示是什么愚蠢的错误?

标签: java microbenchmark caliper


【解决方案1】:

运行它会提示我没有为 size 设置默认值。

参数从默认值设置:

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

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


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

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


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

【讨论】:

  • 很抱歉偷了你的答案maaartinus。显然,对于书呆子来说,变化太大了,以至于无法将其视为“编辑”。
  • 没关系。我可以看到您的答案更好(我也可以看到原因:D)。我只是想合并你被拒绝的编辑。
  • 删除了 main 方法,现在通过 uberjar 运行,谢谢。还删除了包含类。如上所述,我已经使用大小更新了参数列表。然而,在这些变化之后,caliper 仍然没有检测到任何实验。 @Param 值列在“实验选择”下。 Instruments 在该列表中是空白的,但消息“没有使用仪器 [runtime] 为类基准执行的实验”反映了它们很好。有什么见解吗? :( 对不起,我在这里没有经验......
  • 你能用你当前的迭代更新这个问题吗?
  • 完成。抱歉耽搁了,我没有意识到评论更新没有发出通知。
【解决方案2】:

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

这很简单:

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

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

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


有相当多的 Javadoc,例如,@Param。实际上,并没有太大变化。注解取代了约定(现在您不需要time 前缀),参数保持不变,设置使用注解而不是继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多