首页 > 解决方案 > JMH Benchmark 性能怪异,因为 @Param 注释

问题描述

我尝试将 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 操作/秒。为什么这样 ?

标签: javajmh

解决方案


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


推荐阅读