【发布时间】:2020-03-25 15:32:32
【问题描述】:
听说Java支持“Loop Unswitching”,所以在JMH中简单测试了一下。
我认为在 JIT 之后它们会完全一样。这是为什么呢?
private final int TIMES = 1_000_000;
private boolean bool;
private Random r = new Random(93);
@Setup(Level.Invocation)
public void fresh() {
bool = r.nextBoolean();
}
@Benchmark
public void test1(Blackhole bh) {
for (int i = 0; i < TIMES; i++) {
if (bool) {
bh.consume(1);
} else {
bh.consume(2);
}
}
}
@Benchmark
public void test2(Blackhole bh) {
if (bool) {
for (int i = 0; i < TIMES; i++) {
bh.consume(1);
}
} else {
for (int i = 0; i < TIMES; i++) {
bh.consume(2);
}
}
}
测试结果
Benchmark Mode Cnt Score Error Units
LoopUnswitching.test1 avgt 25 1995.192 ± 3.497 us/op
LoopUnswitching.test2 avgt 25 1644.951 ± 4.904 us/op
测试环境
# JMH version: 1.21
# VM version: JDK 1.8.0_222, OpenJDK 64-Bit Server VM, 25.222-b10
【问题讨论】:
标签: java performance jit