jmh从基准改变状态的最佳实践

时间:2016-09-08 14:16:15

标签: java microbenchmark jmh

考虑下面的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);
    }
}

对于参数范围的函数fg进行基准测试的最佳方法是什么? @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());
}

从基准方法改变状态通常是个坏主意吗?

1 个答案:

答案 0 :(得分:2)

您可以使用OptionsBuilder,{}允许您通过OptionsBuilder::params(String, String[])以编程方式设置选项。选项构建器也是demonstrated in the examples