java - 短路评估的性能影响

标签 java performance short-circuiting

免责声明:我在字节码逆向工程方面经验不多,所以如果可以“轻松”回答我的问题,请不要对我太苛刻。

在现代处理器上,如果预测失败,分支可能会非常昂贵(参见 Why is it faster to process a sorted array than an unsorted array?)。

假设我在 Java 中有一些这样的短路评估:

if (condition && (list!=null) && (list.size()>0)) /* Do something */ ;

这基本上相当于一堆这样的分支:

if (condition) {
    if (list!=null) {
        if (list.size()>0) {
            // Do something
        }
    }
}

或者 Java 是否有其他方法可以更巧妙地进行短路?

换句话说,通过像这样重写这一行来避免至少一个分支是否更好:

if ((condition & (list!=null)) && (list.size()>0)) /* Do something */ ;

因为简单的 list!=null-check 比潜在的错误预测分支要便宜得多?

(很明显,如果不冒 NullPointerException 的风险,我无法摆脱第二个 &&。)

现在,在我被诸如“过早优化是万恶之源!”之类的陈述撕成碎片之前,请记住这是在一般编码习惯(始终使用短路与从不使用短路)之间做出选择-circuiting unless required),这将影响我的大部分所有代码,因此确保我在这里使用正确的习惯绝对值得花一些时间考虑。

最佳答案

here提到任何类型的分支。这只是一个表达式求值,if 语句中的 && 与表达式中的 && 没有区别。你会用下面的代码问同样的问题吗?

boolean isValid = condition && (list!=null) && (list.size()>0);
if (isValid) {
    ...
}

这基本上就是发生的事情,表达式被求值,然后分支发生。

关于java - 短路评估的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37891180/

相关文章:

c++ - 连词模板不会短路

java - 如何使用 JAXB 将复杂的 XML 元素映射到 Java 类属性

java - 如何将logback添加到gradle项目中

c - 用于数百万个UINT64 RGBZ图形像素的最快HASH算法

performance - 静态类会导致多核系统出现性能问题吗?

JavaScript OR (||) 短路奇怪行为

c++ - 实例化模板时短路?

java String.getBytes 行为

java - 如何序列化函数返回的 rx.Single 对象?

c - 如何衡量我的代码质量?