For循环或While循环 - 效率

10

这可能是一个愚蠢的问题,但是 while 循环和 for 循环的效率如何比较?一直以来我都被教导说,如果可以使用 for 循环,那么就应该使用它。但实际上它们之间有什么区别呢?

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

相比之下:

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

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


你应该添加一个标签,表明这是哪种语言。看起来像是C语言,但“echo”指示了其他内容。 - onemasse
代码是用PHP编写的(但我匆忙中忘记了在变量前加$符号:P),但问题本意是针对一般编程的。从下面的答案来看,似乎没有确切的区别。 - jwegner
8个回答

12

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

至少在这个例子中,更喜欢使用for循环而非while循环的原因与效率无关;它完全是关于编写能够清晰易懂地表达你意图的代码。

for循环将初始条件、增量和退出条件都放在同一个位置,使得理解更容易。而while循环则将它们分散在各处。例如,在你的示例中,i的初始值是什么?哦,你忘记指定了?——那就是重点。


1
+1;我认为你最简洁地总结了所有的回复;你应该得到“答案”。 - Brad

4

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


3

从大多数答案中,您可以猜出for循环比while循环的主要优势在于可读性。for循环更加简洁美观,看起来更加舒适。而且使用while循环容易陷入无限循环的情况。我认为,如果您可以使用for循环,应该尽量使用,只要坚持这一点,您的编程体验将会更加愉快。


3
for循环while循环之间的性能差异并不是一个大问题,因为现代编译器可以为两种循环生成相同的机器代码,并且两种循环都需要相同的操作:
  1. 计数器变量的初始化。
  2. 测试条件。
  3. 计数器变量的增量/减量。
通常情况下,您应该在代码中使用for循环,原因如下:
  1. 增加代码的可读性。
  2. 提高代码的可维护性,因为所有循环的三个主要部分,即初始化、增量/减量和测试条件都写在同一行(在大多数情况下)。
  3. 它更好地限制了计数器变量的范围,比while循环更有助于更好的内存管理。
我希望这有意义并会有所帮助。

2

这将略有依赖于语言,可能也取决于编译器,但大多数现代编译器会将它们视为完全相同,没有任何区别。


1

把主要的区别看作是风格:使用for循环时,你不需要去寻找初始值、阈值和增量。

如果你忘记增加计数器,用while循环制造一个无限循环也更容易。


1

如果循环很大且复杂,那么循环代码(for或while)的开销将非常低,这就不重要了...

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


测量它。即使汇编代码也无法告诉您处理器实际上对其执行了什么操作... - Roger Lipscombe

1
正如这里所有的回答所提到的,任何一个好的编译器都会将两个循环编译成相同的机器代码。
你的机器代码(以MIPS为例)将是一堆普通的汇编语句,后面跟着一个分支(不等/不相等),从而使你的效率保持一致。
然而,你可以在这里就编码风格问题进行辩论(而不是效率)。
对于循环:
1. 当你确切地知道循环要运行多少次时使用。退出情况已知。 2. 知道每次迭代循环增加的数量。
*可能的用途:当一个项目集合已经存在,你想遍历它并检索某个属性出现的次数时。
对于while循环:
  1. 您不知道循环将运行多少次。在循环运行时,设置/达到退出条件(如果要模拟for循环,您将使用类似计数器的东西(额外的代码))

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

*可能的用途:搜索流以获取某些数据。您不知道流的长度,因此退出条件是当流结束时。由于它是一个流,您可能会逐行获取数据,因此您可能希望完全跳过白线,使您的增量不一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接