我真的试图找到关于这种操作的东西,但我没有找到关于我的问题的具体信息...这很简单:布尔操作比循环中的典型数学运算慢吗?
例如,在使用某种排序时可以看到这一点。该方法将进行迭代并将X与Y进行比较...但这是否比求和或减法循环慢?
实施例: 布尔比较
for(int i=1; i<Vector.Length; i++) if(Vector[i-1] < Vector[i])
与总和:
Double sum = 0;
for(int i=0; i<Vector.Length; i++) sum += Vector[i];
(谈论大长度循环)
处理器完成哪个更快? 布尔值是否需要更多操作才能返回“true”或“false”?
答案 0 :(得分:2)
没有正确的答案,因为你的问题不够具体(你给出的两个代码示例并没有达到同样的目的)。
如果你的问题是:
bool isGreater = (a > b);
比int sum = a + b;
更慢还是更快?
然后答案是:除非你非常非常关心你花了多少个周期,否则这个问题大致相同,在这种情况下,它取决于你的处理器而你需要阅读其文档。
如果你的问题是:
我提供的第一个例子比第二个例子更慢或更快地迭代?
然后答案是:它主要取决于数组包含的值,还取决于编译器,处理器和许多其他因素。
在大多数处理器上,布尔运算没有理由比加法明显更慢或更快:两者都是基本指令,即使比较可能需要两个(减去,然后比较为零)。解码指令所需的周期数取决于处理器,可能会有所不同,但除非您处于关键循环中,否则几个周期不会产生很大的差异。
在您提供的示例中,if条件可能有害,因为instruction pipelining。现代处理器非常难以猜测下一批指令将会是什么,因此他们可以预先获取它们并将它们并行处理。 如果存在分支,则处理器不知道是否必须执行then
或else
部分,因此它会根据之前的时间进行猜测。
如果您的情况结果在大多数情况下是相同的,那么处理器可能会猜对了,这样做会很顺利。但如果条件的结果不断变化,则处理器无法正确猜测。当这样的branch misprediction发生时,这意味着它可以抛弃管道的内容并重新进行,因为它只是意识到它没有实际意义。 那。确实。伤。
您可以自己尝试:当它们相同,增加,减少,交替或随机值时,测量运行超过一百万个元素的循环所需的时间。
这导致我得出结论:处理器已成为一些非常复杂的野兽而且没有黄金答案,只是经验法则,所以你需要测量和分析。您可以阅读其他人测量的内容,以了解您应该或不应该做什么。
玩得开心试验。 :)