我想知道在循环中进行小于或等于比较的效率是否更高效。 <=
运算符是否指示计算机进行两次比较(是否小于,是否相等),还是简化它?以下面的例子为例。我想要一个循环而不是增量到1000.我应该将上限设置为1001并告诉它while i is < (OR !=) 1001, i++;
?或者我应该告诉它while i <= 1000, i++;
?编译器(GCC)会将其简化为相同的基本指令吗?
答案 0 :(得分:7)
机器级架构将具有针对两者的OP代码。和&lt; =操作,并且两个比较都可以在CPU的一个循环中进行。意思是没有区别。
答案 1 :(得分:3)
这取决于架构。
最初的冯·诺伊曼IAS架构(1945)确实只进行了>=
比较。
英特尔8086可以使用Loop label
范例,对应于do { } while (--cx > 0);
在传统架构中,LOOP
不仅更小,而且速度更快。在现代架构中,LOOP
被认为是复杂的操作,比dec ecx; jnz label;
慢。在优化大小(-Os)时,这仍然具有重要意义。
进一步考虑一些(RISC)体系结构没有显式标志寄存器。然后比较不能自由,作为循环减量的副作用。一些RISC架构还有一个特殊的“零”寄存器,这意味着,零比较(以及所有其他数学运算)始终可用。具有跳转延迟时隙的RISC甚至可以通过使用后递减来获益:do { } while (a-- > 0);
优化编译器应该能够将一个简单的循环转换为给定体系结构的最优化版本,而不管语法如何。复杂循环将依赖于迭代器,副作用或两者:for (i=0;i<5;i++) func(i);
。
答案 2 :(得分:0)
测量它。只有这样你才能完全确定哪个更快。
你可能会想到在这里发挥作用的所有部分(编译器,优化,处理器等)。但最终如果花费的时间更少则会更快。它就这么简单。