考虑下面的jmh-test。
@State(Scope.Thread)
public class Test {
private int value;
@Benchmark
public int testF() {
return f(value);
}
@Benchmark
public int testG() {
return g(value);
}
}
对于参数范围的函数f
和g
进行基准测试的最佳方法是什么? @Param
仅适用于少量不同的输入,@Setup(Level.Invocation)
可能会影响结果的准确性。其他方式(如生成输入数组和增加基准内的索引)会导致从基准方法改变状态。
private int[] values;
private int index;
@Setup
private void generateValues() {
values = new int[0x10000];
...
index = 0;
}
private int nextValue() {
return values[index++ & 0xFFFF];
}
@Benchmark
private int testF() {
return f(nextValue());
}
从基准方法改变状态通常是个坏主意吗?
答案 0 :(得分:2)
您可以使用OptionsBuilder
,{}允许您通过OptionsBuilder::params(String, String[])
以编程方式设置选项。选项构建器也是demonstrated in the examples。