加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中的布尔表达式优化

发布时间:2020-12-15 02:05:44 所属栏目:Java 来源:网络整理
导读:考虑 Java中的以下方法: public static boolean expensiveComputation() { for (int i = 0; i Integer.MAX_VALUE; ++i); return false;} 以下主要方法: public static void main(String[] args) { boolean b = false; if (expensiveComputation() b) { }}
考虑 Java中的以下方法:

public static boolean expensiveComputation() {
    for (int i = 0; i < Integer.MAX_VALUE; ++i);
    return false;
}

以下主要方法:

public static void main(String[] args) {
    boolean b = false;
    if (expensiveComputation() && b) {
    }
}

逻辑连接(与&&)相同是commutative operation.那么为什么编译器不会将if语句代码优化为等效代码:

if (b && expensiveComputation()) {
}

哪个有benefits of using short-circuit evaluation?

此外,编译器是否尝试对布尔值进行其他逻辑简化或置换以生成更快的代码?如果没有,为什么?当然,一些优化会非常困难,但我的例子并不简单?调用方法应该总是比读取布尔值慢,对吧?

先感谢您.

解决方法

它不会这样做,因为expensiveComputation()可能有副作用,改变程序的状态.这意味着评估布尔语句中表达式的顺序(expensiveComputation()和b)很重要.您不希望编译器将错误优化到编译的程序中,对吗?

例如,如果代码是这样的话

public static boolean expensiveComputation() {
        for (int i = 0; i < Integer.MAX_VALUE; ++i);
        b = false;
        return false;
}

public static boolean b = true;
public static void main(String[] args) {
        if (expensiveComputation() || b) {
        // do stuff
        }
}

在这里,如果编译器执行了优化,那么当你不希望它通过查看代码时会运行// do stuff(因为b,它最初是真的,首先被评估).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读