提问人:Si_plus_plus 提问时间:11/22/2014 最后编辑:arcyqwertySi_plus_plus 更新时间:11/22/2014 访问量:191
循环中的布尔运算是否比数学运算慢?
Are boolean operations slower than mathematical operations in loops?
问:
我真的试图找到有关此类操作的信息,但我没有找到有关我的问题的具体信息......这很简单:布尔运算是否比循环中的典型数学运算慢?
例如,在使用某种排序时可以看到这一点。该方法将进行迭代并将 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”?
答:
短版
没有正确答案,因为你的问题不够具体(你给出的两个代码示例没有达到相同的目的)。
如果您的问题是:
bool 是 Greater = (a > b);
比int 和 = a + b;
慢还是快?
那么答案将是:除非你非常非常非常非常非常关心你花了多少个周期,否则它大致相同,在这种情况下,这取决于你的处理器,你需要阅读它的文档。
如果您的问题是:
我给出的第一个示例的迭代速度是比第二个示例慢还是快?
那么答案是:这主要取决于数组包含的值,但也取决于编译器、处理器和许多其他因素。
加长版
在大多数处理器上,布尔运算没有理由比加法慢得多或快:两者都是基本指令,即使比较可能需要其中两个(减去,然后比较到零)。解码指令所需的周期数取决于处理器,并且可能会有所不同,但除非您处于关键循环中,否则几个周期不会有太大区别。
但是,在您给出的示例中,由于指令流水线,if 条件可能是有害的。现代处理器非常努力地猜测下一组指令将是什么,以便它们可以预取它们并并行处理它们。如果存在分支,处理器不知道是否必须执行 or 部分,因此它会根据之前的时间进行猜测。then
else
如果您的条件结果在大多数情况下是相同的,处理器可能会猜对,这将很顺利。但是,如果条件的结果不断变化,那么处理器将无法正确猜测。当这样的分支错误预测发生时,这意味着它可以扔掉管道的内容并重新做一遍,因为它刚刚意识到它没有意义。那。 确实,很痛。
您可以自己尝试一下:测量在一百万个元素上运行循环所需的时间,当它们具有相同、增加、减少、交替或随机值时。
这使我得出结论:处理器已经成为一些非常复杂的野兽,没有黄金答案,只有经验法则,所以你需要测量和分析。你可以阅读其他人所做的测量,以了解你应该做什么或不应该做什么。
玩得开心。:)
评论
if [<,>,=]
1 +1 = 2
25 > 22 = true or false