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)。
我尝试使用带有参数的 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)。