对于循环或循环 - 效率

时间:2010-11-18 18:21:41

标签: loops performance

这可能是一个愚蠢的问题,但是while循环的效率与for循环的效率相比如何呢?我一直被教导如果你可以使用for循环,那么我应该。但实际上是什么区别:

$i = 0;
while($i < 100) {
     echo $i;
     $i++;
} 

比较:

for($i = 0; $i < 100; $i++) {
    echo $i;
}

我知道在这些具体的例子中差异就像.000000001%,但是当我们谈论大型复杂循环时,有什么区别?

8 个答案:

答案 0 :(得分:11)

我认为你从你给出的建议中得出了错误的结论。

优先for构造优于while的原因(至少在这种情况下)与效率无关;这就是编写代码,以清晰易懂的方式表达您的意图。

for将初始条件,增量和退出条件放在一个地方,使其更容易理解。 while循环将它们展开。例如,在您的样本中,i的初始值是多少?哦,你忘了指定它? - 这就是重点。

答案 1 :(得分:4)

这取决于您使用的确切编译器。在您的示例中,一个好的编译器将为这两个选项创建相同的机器代码。

答案 2 :(得分:4)

正如您可以从大多数答案中猜到的那样,for循环超过while循环的主要优点是可读性。 for循环更清洁,更好看。使用while循环陷入无限循环也更容易。我会说我同意你的教导,如果你可以使用for循环,你应该,所以只要你坚持这一点,你的编程经验将会更加愉快。

答案 3 :(得分:3)

for loopwhile loop之间的性能差异不是一个大问题,因为现代编译器可以为两个循环生成相同的机器代码,其次两个循环都需要相同的操作:

  1. 计数器变量的初始化。
  2. 测试条件。
  3. 计数器变量的递增/递减。
  4. 通常,您应在代码中使用for loop,原因如下:

    1. 提高代码的可读性。
    2. 为了提高代码的可维护性,因为循环的所有三个主要部分,即初始化,递增/递减和测试条件都写在同一行(在大多数情况下)。
    3. 它比while loop更好地限制范围的计数器变量,因此它有助于更​​好的内存管理。
    4. 我希望这是有道理的,也会有所帮助。

答案 4 :(得分:2)

它可能会略微依赖于语言,也可能依赖于编译器,但大多数现代编译器都会将它们视为完全相同,并且没有区别。

答案 5 :(得分:1)

将主要区别视为样式:使用for循环,您不必去寻找初始值,阈值和增量。

while开出无限循环也容易得多,因为你忘了增加。

答案 6 :(得分:1)

好吧,如果循环很大且很复杂,那么循环代码的开销就无关紧要了 (for或while)会很低......

无论如何,如果你真的想知道,我想由你来检查你的ide, 在汇编代码中。或者您可以使用解析器来查看自己的可执行文件。 http://www.caesum.com/files/borg228.zip (警告:.exe中通常有很多膨胀,祝你好运!)

答案 7 :(得分:1)

正如这里的所有答案中所提到的,任何体面的编译器都会将两个循环编译成相同的机器代码。

你的机器代码(以MIPS为例)将是一堆正常的汇编语句,后面跟一个分支(onequal / notequal),两种情况都会使你的效率保持一致。

但是,你可以在这里讨论编码风格问题(非效率)。

对于循环:

  1. 当您完全知道循环运行的次数时使用。退出案例已知。
  2. 了解每次迭代循环的增量量
  3. *可能的用法:当一个项目集合已经存在并且您想要检查它并检索某个属性出现的次数时。

    循环:

    1. 您不知道循环将运行多少次。循环运行时有一个退出案例设置/到达(如果你想模拟一个for循环,你会使用类似计数器(额外的代码))

    2. 不知道你的循环将增加多少。您的增量/下一步移动可以动态设置。虽然您可以在for循环中执行此操作,但您必须考虑每次迭代时的增量以及导致某些不可读的代码,如果您使用while循环,则可以避免这些代码。

    3. *可能的用法:为某些数据点击流。您不知道流的长度,因此当流结束时您的退出情况就是如此。由于它是一个流,并且您可能逐行获取数据,因此您可能希望跳过白线,使得增量不一致。