布尔运算比循环中的数学运算慢吗?

时间:2014-11-22 04:05:27

标签: performance language-agnostic programming-languages

我真的试图找到关于这种操作的东西,但我没有找到关于我的问题的具体信息...这很简单:布尔操作比循环中的典型数学运算慢吗?

例如,在使用某种排序时可以看到这一点。该方法将进行迭代并将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”?

1 个答案:

答案 0 :(得分:2)

短版

没有正确的答案,因为你的问题不够具体(你给出的两个代码示例并没有达到同样的目的)。

如果你的问题是:

  

bool isGreater = (a > b);int sum = a + b;更慢还是更快?

然后答案是:除非你非常非常关心你花了多少个周期,否则这个问题大致相同,在这种情况下,它取决于你的处理器而你需要阅读其文档。

如果你的问题是:

  

我提供的第一个例子比第二个例子更慢或更快地迭代?

然后答案是:它主要取决于数组包含的值,还取决于编译器,处理器和许多其他因素。

更长的版本

在大多数处理器上,布尔运算没有理由比加法明显更慢或更快:两者都是基本指令,即使比较可能需要两个(减去,然后比较为零)。解码指令所需的周期数取决于处理器,可能会有所不同,但除非您处于关键循环中,否则几个周期不会产生很大的差异。

在您提供的示例中,if条件可能有害,因为instruction pipelining。现代处理器非常难以猜测下一批指令将会是什么,因此他们可以预先获取它们并将它们并行处理。 如果存在分支,则处理器不知道是否必须执行thenelse部分,因此它会根据之前的时间进行猜测。

如果您的情况结果在大多数情况下是相同的,那么处理器可能会猜对了,这样做会很顺利。但如果条件的结果不断变化,则处理器无法正确猜测。当这样的branch misprediction发生时,这意味着它可以抛弃管道的内容并重新进行,因为它只是意识到它没有实际意义。 那。确实。伤。

您可以自己尝试:当它们相同,增加,减少,交替或随机值时,测量运行超过一百万个元素的循环所需的时间。

这导致我得出结论:处理器已成为一些非常复杂的野兽而且没有黄金答案,只是经验法则,所以你需要测量和分析。您可以阅读其他人测量的内容,以了解您应该或不应该做什么。

玩得开心试验。 :)