栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/470307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号