免责声明:我在字节码逆向工程方面经验不多,所以如果可以“轻松”回答我的问题,请不要对我太苛刻。
在现代处理器上,如果预测失败,分支可能会非常昂贵(参见 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/