在这个代码中: if (value >= x && value <= y) { 当value >= x和value <= y情况下, 如果没有特定的模式可能是真的, 那么使用&运算符会比使用&&更快吗? 具体来说,我正在思考如何&&懒惰地评估右侧expression式(即只有当LHS是真实的),这意味着一个条件,而在Java &在这方面保证严格评估两个(布尔)子expression式。 价值结果是相同的任何方式。 但是,当>=或<=运算符将使用一个简单的比较指令时, &&必须包含一个分支,并且该分支容易出现分支预测失败 – 按照这个非常着名的问题: 为什么处理sorting数组的速度比一个未分类的数组? 因此,强迫expression没有懒惰的组件肯定会更确定,不容易被预测失败。 对? 笔记: 显然,如果代码如下所示,我的问题的答案是否定的: if(value >= x && verySlowFunction()) 。 我正在关注“足够简单”的RHSexpression式。 那里有一个条件分支( if语句)。 我无法向自己certificate这是无关紧要的,而替代forms可能是更好的例子,比如boolean b = value >= x && value <= y; 这一切都落入了可怕的微观优化的世界。 是的,我知道:-) …虽然有趣? 更新只是为了解释我为什么感兴趣:我一直在盯着Martin Thompson在他的Mechanical Sympathy博客上写过的系统,在他来和Aeron 谈论之后 […]
我正在用Java编写一些代码,在某些情况下,程序stream由两个intvariables“a”和“b”是否非零来确定(注意:a和b从不是负数,从不在整数溢出范围内)。 我可以用它来评估它 if (a != 0 && b != 0) { /* Some code */ } 或者, if (a*b != 0) { /* Some code */ } 因为我希望那段代码每次运行数百万次,所以我想知道哪一个会更快。 我通过在一个巨大的随机生成的数组上进行比较来做实验,我也很好奇数组的稀疏性(数据分数= 0)如何影响结果: long time; final int len = 50000000; int arbitrary = 0; int[][] nums = new int[2][len]; for (double fraction = 0 ; fraction <= 0.9 […]