JMH:约束参数空间

4
假设我有一个带有两个参数的JMH测试:
@Param( { "1", "2", 4", "8", "16" } )
int param1;

@Param( { "1", "2", 4", "8", "16" } )
int param2;

有没有一种惯用的方法来对参数添加约束,例如仅限于 param1 < param2 的基准测试?

从 @SetUp 中抛出异常可以起到作用,但会增加输出的噪声。

1个回答

4

目前还不行。如果你觉得注释太过束缚,可以退而求其次使用API。在那里,你可以这样做:

for (int p1 = 1; p1 <= 16; p1 *= 2) {
   for (int p2 = 1; p2 <= p1; p2 *= 2) {
      Options opt = new OptionsBuilder()
        ...
        .param("param1", p1)
        .param("param1", p2)
        .build();

       RunResult r = new Runner(opt).runSingle();
       ... put r somewhere to process
   }
}

(维护者的观点:似乎没有必要为JMH创建一个完整的基于注释的DSL,让用户在Java中编写高级场景更简单)。

更新:想一想,如果您想保持仅使用注释的方式,您可能可以将两个参数编码到单个@Param中。


1
谢谢Aleksey - 一切都很清楚。一个简单的方法可能是使用SkipBenchmarksException,可以从@Setup中抛出,表示当前参数组合应该被静默跳过。 - Philip Aston
这与 JUnit 的假设(assumptions)类似: Assert.assumeThat(someBoolean, someMatcher); - Nitsan Wakart
当实现了SkipBenchmarksException之后,从@Setup中调用的System.exit(0)将不再起作用。 - Vladimir Sitnikov

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