【发布时间】:2015-03-12 14:23:05
【问题描述】:
众所周知,在 JMH 基准测试中使用循环并不是一个好主意,因为它会被 JIT 编译器优化,因此应该避免。有没有办法在不使用循环的情况下为我的 JMH 基准测试方法提供不同的 int 输入值(输入列表)。
【问题讨论】:
众所周知,在 JMH 基准测试中使用循环并不是一个好主意,因为它会被 JIT 编译器优化,因此应该避免。有没有办法在不使用循环的情况下为我的 JMH 基准测试方法提供不同的 int 输入值(输入列表)。
【问题讨论】:
看看this example in the JMH documentation。您可以在字段上使用@Param 注释,以告诉 JMH 注入此注释的值:
@Param({"1", "2"})
public int arg;
@Benchmark
public int doBenchmark() {
return doSomethingWith(arg);
}
然后针对 1 和 2 的值运行基准测试。
请注意,如果带注释的字段不是String 而是原语,则在赋值之前解析值并以转换后的形式进行赋值。如果您有多个带有@Param 注释的字段,JMH 将使用任何可能的字段值排列来运行基准测试。
您还可以在定义 JMH 运行器时覆盖赋值。
【讨论】:
@State 对象中准备一组参数以及一个计数器。你可以在@TearDown(Level.Iteration)中移动这个计数器。