是否存在使用while loop vs foreach / for循环的性能问题?

时间:2009-12-06 07:52:12

标签: php performance programming-languages language-features

使用while loop v / s foreach / for循环或反之亦然有什么性能问题?

在php中使用foreach循环v / s总是更好吗?

5 个答案:

答案 0 :(得分:5)

您已将此列为“与语言无关”,但答案将是语言(或更确切地说,编译器) - 具体。

理论上,foreach可以同样快,如果不是更快,特别是如果常规for循环继续执行昂贵的操作来测试计数。

此外,foreach适用于延迟加载的集合,常规for循环必须提前知道项目数。

最后,即使foreach在您的平台上稍微慢一点,差异也不大可能,并且 for循环更容易维护。不要过早优化。 (顺便说一句,这是.NET的情况,但是,他们已经整理了普查员的表现。)

答案 1 :(得分:2)

假设foreach 可能较慢 - for循环和具有相同条件的while循环应相等。

foreach需要遍历手头的数据结构,因此无论结构的下一个查找(以及维护状态)如何,都可能会降低你的速度。

但是,如果您在forwhile循环中手动执行此操作,那么它可能是相同的。

当然,最好的答案是尝试并计时,看看答案究竟是什么。

答案 2 :(得分:2)

我知道这已有多年了,但我需要为未来的googlers指出一些事情:

“foreach”要求您正在加载和完成的数据 - 例如,您将循环的数组已经存在于内存中。

“while”只需要一个值(可以是数据或false - 是否继续循环)。正确编程循环,while循环只需要加载下一个值而不是整个数据集。因此,如果您要对while循环进行编程以从函数中绘制数据,则可以大大减少内存使用量。

一个例子可能是遍历一个庞大的百万行数据库的每一行;使用foreach,你需要加载整个数据集来执行循环,这会让你的记忆活跃起来。但是使用仅拉动所需下一行的函数,您将成功完成循环。

下面的伪代码解释道:

function nextrow ()
{
  static myquery = sql_query('SELECT * FROM `hugetable`')
  return(next_row(myquery));
}
while(row = nextrow()) { ...do stuff... }

答案 3 :(得分:0)

简答:不。废弃一个单一的想法并不是一件有用的事情。

答案 4 :(得分:0)

我为php | architect撰写了一篇关于PHP循环问题的文章。基准测试显示,即使使用我的惰性数值范围扩展,循环开销也没有显着影响。

IIRC,一旦排除内存和生成器功能的成本,foreach比for循环慢2.9倍。如果你的循环内容小于循环开销的2.9倍,那么你可能想重新考虑你正在做什么。

此外,如果您正在寻找一种语言的原始循环性能,PHP应该在您的绝对最后选择列表中。它被解释并且单独地不适合长期运行。

大多数PHP程序员都会浪费无数个循环来连接字符串。这说明了过早的优化警告。我敢打赌,只需在你的“echo”语句中添加逗号就可以使你的表现翻倍。

使用XDebug或其他东西配置您的代码。找到真正的瓶颈。循环不是它。相信我。它永远不会。