可能重复:
倒计时比计数更快?
哪个循环有更好的性能?我从一些地方学到了第二个更好的地方.但想知道原因.
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 比较容易,但我认为你可以使用其中任何一个,因为编译器会优化它们.
我不认为两个循环的性能有很大差异.
我想,当循环看起来像这样时,它会变成另一种情况.
for(int i = 0; i < getMaximum(); i++)
{
}
for(int i = getMaximum() - 1; i >= 0; i--)
{
}
Run Code Online (Sandbox Code Playgroud)
因为getMaximum()函数被调用一次或多次(假设它不是内联函数)
如果在硬件中优化针对零的测试,则递减循环降至零有时会更快.但这是一个微观优化,你应该分析一下它是否真的值得做.编译器通常会为您进行优化,并且假设减量循环可以说是更糟糕的意图表达,那么通常只需坚持使用"正常"方法就可以了.
递增和递减(INC 和 DEC,当翻译成汇编命令时)具有 1 个 CPU 周期的相同速度。
然而,理论上第二个在某些(例如 SPARC)架构上可能更快10,因为不需要从内存(或缓存)中获取:大多数架构都有在与特殊值0(通常具有特殊的硬连线)进行比较时以优化方式处理的指令。 0-寄存器用作操作数,因此不必“浪费”寄存器来存储10每次迭代的比较)。
智能编译器(特别是如果目标指令集是 RISC)本身会检测到这一点,并且(如果循环中未使用计数器变量)应用第二个“递减至 0”形式。
请参阅答案/sf/answers/197621511/和/sf/answers/197616681/了解更多详细信息。