在JMH中用不同值进行微基准测试循环

7
众所周知,在JMH基准测试中使用循环并不是一个好主意,因为它将被JIT编译器优化,因此应该避免使用。有没有一种方法可以在不使用循环的情况下向我的JMH基准测试方法提供不同值的int输入(输入列表)呢?
1个回答

19

看一下JMH文档中的这个例子。您可以在字段上使用@Param注释,以告诉JMH注入此注释的值:

@Param({"1", "2"})
public int arg;

@Benchmark
public int doBenchmark() {
  return doSomethingWith(arg);
}

然后对值12运行基准测试。

请注意,如果注释字段不是String而是原始类型,则在分配之前解析这些值,并以它们的转换形式分配它们。如果您有多个带有@Param注释的字段,则JMH将使用任何可能的字段值排列方式运行基准测试。

在定义JMH运行器时,您还可以覆盖值分配。


2
愚蠢的问题:假设我有50-60万个值,代表着大约一千个不同值的真实分布,我希望我的微基准测试反映这种负载。比方说,被测试的代码正在检测URL中的某些模式,数据的形状对于找到全局最优实现非常重要。我该怎么办? - KarlP
2
@KarlP 我不知道这是不是一个好的解决方案,但是你可以在 @State 对象中准备一组参数数组和一个计数器。然后你可以在 @TearDown(Level.Iteration) 中移动这个计数器。 - Imaskar
或者在基准测试方法本身内部,就像JMH示例所建议的那样。 - Imaskar
如果我需要的参数不是基本类型,该怎么办? - undefined

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