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

Are boolean operations slower than mathematical operations in loops?

提问人:Si_plus_plus 提问时间:11/22/2014 最后编辑:arcyqwertySi_plus_plus 更新时间:11/22/2014 访问量:191

问:

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

例如,在使用某种排序时可以看到这一点。该方法将进行迭代并将 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赞 MeBigFatGuy 11/22/2014
以尽可能可读的方式编写代码,不要为这些微优化选择而烦恼。他们无关紧要。
0赞 arcyqwerty 11/22/2014
一般来说,我不会太担心微优化,因为性能很大程度上取决于运行程序的编译器和处理器。至于你的问题,我有点难以理解......在内部,布尔值被视为数字。某些操作通常可以在单个 CPU 指令中完成。例如,操作通常有像 jump if greater/lesser/equal 这样的指令,这将比执行数学计算更快。if [<,>,=]
0赞 Si_plus_plus 11/22/2014
@arcyqwerty 所以总而言之......处理器的工作比 ?1 +1 = 225 > 22 = true or false
2赞 arcyqwerty 11/22/2014
取决于所讨论的处理器以及编译器如何将该行代码转换为机器代码。在任何现代处理器中,这两种操作都将得到大量优化,特别是对于纯增量(而不是添加任意数量)的情况

答:

3赞 Julien Guertault 11/22/2014 #1

短版

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

如果您的问题是:

bool 是 Greater = (a > b);int 和 = a + b; 慢还是快?

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

如果您的问题是:

我给出的第一个示例的迭代速度是比第二个示例慢还是快?

那么答案是:这主要取决于数组包含的值,但也取决于编译器、处理器和许多其他因素。

加长版

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

但是,在您给出的示例中,由于指令流水线,if 条件可能是有害的。现代处理器非常努力地猜测下一组指令将是什么,以便它们可以预取它们并并行处理它们。如果存在分支,处理器不知道是否必须执行 or 部分,因此它会根据之前的时间进行猜测。thenelse

如果您的条件结果在大多数情况下是相同的,处理器可能会猜对,这将很顺利。但是,如果条件的结果不断变化,那么处理器将无法正确猜测。当这样的分支错误预测发生时,这意味着它可以扔掉管道的内容并重新做一遍,因为它刚刚意识到它没有意义。那。 确实,很痛。

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

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

玩得开心。:)