在Java中,&可以比&&快吗?
在此代码中: if (value >= x && value <= y) { 在没有特定模式的情况下,何时value >= x和value <= y可能与否一样,使用&运算符会比使用&&? 具体来说,我正在考虑如何&&懒惰地评估右侧表达式(即,仅当LHS为true时),这意味着有条件,而在Java&中,这保证了对两个(布尔)子表达式的严格评估。两种方法的值结果都是相同的。 但是,尽管>=or<=运算符将使用一个简单的比较指令,但&&必须包含一个分支,并且该分支易受分支预测失败的影响-正如这个非常著名的问题:为什么处理排序数组要比未排序数组快? 因此,强制表达式不包含惰性成分肯定会更具确定性,并且不容易受到预测失败的影响。对? 笔记: 如果代码看起来像这样,显然我的问题的答案将是“否” if(value >= x && verySlowFunction())。我专注于“足够简单”的RHS表达式。 无论如何,那里有一个条件分支(该if语句)。我无法向自己证明这是无关紧要的,替代性表述可能是更好的示例,例如boolean b = value >= x && value <= y; 所有这些都属于可怕的微观优化领域。是的,我知道:-) ...不过有趣吗? 更新 只是为了解释我为什么感兴趣:我一直在盯着Martin Thompson在他来关于Aeron的话题之后在他的Mechanical Sympathy博客上一直在写的系统。关键信息之一是我们的硬件中包含了所有这些神奇的内容,而我们的软件开发人员却不幸地无法利用它。不用担心,我不会在所有代码上都使用s / && / \&// :-) ...但是这个站点上有很多关于通过删除分支来改善分支预测的问题,对我来说,条件布尔运算符是测试条件的核心。 当然,@ StephenC提出了一个奇妙的观点,即将代码弯曲为怪异的形状可以使JIT不太容易发现常见的优化-如果不是现在,则不是将来。而且上述非常著名的问题之所以特别,是因为它使预测的复杂性远远超出了实际优化的范围。 我非常清楚,在大多数(或几乎所有)情况下,这&&是最清晰,最简单,最快,最好的方法-尽管我非常感谢发布了答案的人,以证明这一点!我真的很想看看在任何人的经验中,是否确实有任何案例可以回答“可以&更快?”。可能是... …