JMH禁用
Blackhole.consume方法的内联。非内联方法是JVM的黑匣子-
编译器不知道该方法是否会修改字段,引发异常,将其注册为垃圾等。JIT编译器无法在此类方法调用中应用许多优化。(想象一下,黑盒方法使用反射来修改
bool字段,因此循环取消切换将变得无效)。
当编译范围包括整个循环主体时,HotSpot JVM仍支持循环取消切换,并且在整个循环中条件是恒定的。
考虑修改后的基准:
@State(Scope.Benchmark)public class LoopUnswitching { private static final int TIMES = 10_000; private final Random r = new Random(93); private final int[] x = r.ints(TIMES).toArray(); private final int[] y = r.ints(TIMES).toArray(); private boolean bool; @Setup(Level.Invocation) public void setup() { bool = r.nextBoolean(); } @Benchmark public int test1() { int sum = 0; for (int i = 0; i < TIMES; i++) { if (bool) { sum += x[i]; } else { sum += y[i]; } } return sum; } @Benchmark public int test2() { int sum = 0; if (bool) { for (int i = 0; i < TIMES; i++) { sum += x[i]; } } else { for (int i = 0; i < TIMES; i++) { sum += y[i]; } } return sum; }}
在这种情况下,
test1和的性能
test2类似:
Benchmark Mode Cnt Score Error UnitsLoopUnswitching.test1 avgt 10 2910,432 ± 3,287 ns/opLoopUnswitching.test2 avgt 10 2912,922 ± 9,367 ns/op
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)