JMH Benchmark 怪异的性能,因为@Param 注解

JMH Benchmark weird performance because @Param annotation

我尝试使用带有参数的 JMH,但是当使用 @Param 注释时我得到了奇怪的结果。 这是硬编码函数参数的情况:

@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 4, time = 4, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class MyBenchmark {

    NumberToBinaryArray array = new NumberToBinaryArray();

    @Benchmark
    public void testMethod() {
        array.toBinaryArray2(0);
    }
}

此实现具有以下性能: 2_312_967_772 ops/sec(大约是 20 亿 ops/sec)。但是,如果我使用 JMH 性能减慢的参数:

public class MyBenchmark {

    NumberToBinaryArray array = new NumberToBinaryArray();

    @Param({"0"})   <= changed here
    private int arg;   

    @Benchmark
    public void testMethod() {
        array.toBinaryArray2(arg);   <= changed here
    }
}

性能是 484_748_276 ops/sec。 为什么会这样?

我找到原因了。这是因为不是最终字段 (arg)。