“循环取消切换”优化无效

“循环取消切换”优化无效,第1张

循环取消切换”优化无效

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5462150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存