哪个循环有更好的性能?增加还是减少?

Ras*_*yak 13 c performance

可能重复:
倒计时比计数更快?

哪个循环有更好的性能?我从一些地方学到了第二个更好的地方.但想知道原因.

  for(int i=0;i<=10;i++)
      {
               /*This is better ?*/
      }


  for(int i=10;i>=0;i--)
      {
               /*This is better ?*/
      }
Run Code Online (Sandbox Code Playgroud)

Pho*_*ixS 21

第二个"可能"更好,因为i与0 比较比i用10 比较容易,但我认为你可以使用其中任何一个,因为编译器会优化它们.

  • 因为大多数处理器都有比较为零的指令?所以他们不需要加载`i`和10,减去它们然后比较为零,但只是将`i`立即比较为零. (10认同)
  • +1因为他没有任何理由而被击败 (3认同)
  • +1让新手放松一下,因为他的答案是正确的 (2认同)
  • @funnyGraphicsThingy - 因为通常不需要显式比较来检测零作为算术或逻辑结果 - 已经设置了CPU零标志.那,以及许多指令集提供循环/重复操作,将寄存器自动倒计时为零.OP为+1 (2认同)

Veg*_*ger 8

认为两个循环的性能有很大差异.

我想,当循环看起来像这样时,它会变成另一种情况.

for(int i = 0; i < getMaximum(); i++)
{
}

for(int i = getMaximum() - 1; i >= 0; i--)
{
}
Run Code Online (Sandbox Code Playgroud)

因为getMaximum()函数被调用一次或多次(假设它不是内联函数)


Stu*_*etz 5

如果在硬件中优化针对零的测试,则递减循环降至零有时会更快.但这是一个微观优化,你应该分析一下它是否真的值得做.编译器通常会为您进行优化,并且假设减量循环可以说是更糟糕的意图表达,那么通常只需坚持使用"正常"方法就可以了.


Una*_*ivi 5

递增和递减(INC 和 DEC,当翻译成汇编命令时)具有 1 个 CPU 周期的相同速度。

然而,理论上第二个在某些(例如 SPARC)架构上可能更快10,因为不需要从内存(或缓存)中获取:大多数架构都有在与特殊值0(通常具有特殊的硬连线)进行比较时以优化方式处理的指令。 0-寄存器用作操作数,因此不必“浪费”寄存器来存储10每次迭代的比较)。

智能编译器(特别是如果目标指令集是 RISC)本身会检测到这一点,并且(如果循环中未使用计数器变量)应用第二个“递减至 0”形式。

请参阅答案/sf/answers/197621511//sf/answers/197616681/了解更多详细信息。