Php 使用while循环与foreach/for循环是否存在性能问题?

Php 使用while循环与foreach/for循环是否存在性能问题?,php,performance,programming-languages,language-features,Php,Performance,Programming Languages,Language Features,使用while循环v/s foreach/for循环或使用while循环v/s foreach/for循环的性能问题是什么 在php中使用foreach循环v/s是否总是更可取?您已将其列为语言不可知,但答案将是语言,或者更确切地说,编译器特定的 理论上,foreach可以同样快,如果不是更快的话,尤其是当常规for循环继续执行昂贵的操作来测试计数时 此外,foreach适用于延迟加载的集合,常规for循环必须提前知道项的数量 最后,即使foreach在您的平台上稍微慢一点,差异也不太可能有影响

使用while循环v/s foreach/for循环或使用while循环v/s foreach/for循环的性能问题是什么


在php中使用foreach循环v/s是否总是更可取?

您已将其列为语言不可知,但答案将是语言,或者更确切地说,编译器特定的

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

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


最后,即使foreach在您的平台上稍微慢一点,差异也不太可能有影响,而且它比for循环更易于维护。不要过早地优化。顺便说一句,.NET在一段时间内就是这样,他们已经整理了枚举器的性能。

您已经将其列为语言不可知,但答案将是语言,或者更确切地说,编译器特定的

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

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

最后,即使foreach在您的平台上稍微慢一点,差异也不太可能有影响,而且它比for循环更易于维护。不要过早地优化。顺便说一句,.NET的情况就是这样的,因为他们已经整理了枚举器的性能。

假设foreach可能会更慢-具有相同条件的for循环和while循环应该是等效的

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

但是,如果您在for或while循环中手动执行此操作,则可能是相同的

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

假设,foreach可能会慢一些——具有相同条件的for循环和while循环应该是等价的

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

但是,如果您在for或while循环中手动执行此操作,则可能是相同的


当然,最好的答案是试试看,然后计时,看看答案到底是什么。

简短的回答:不。这不是一件有用的事情,哪怕浪费一个念头

简短回答:不。浪费一个念头也没用

我为php | architect写了一篇关于php中循环问题的文章。基本上,基准测试表明,循环开销没有显著影响。。。即使在使用我的惰性数字范围扩展时

IIRC,foreach比for循环慢2.9倍,只要排除内存和生成器函数的成本。如果循环的内容少于循环开销的2.9倍,那么您可能需要重新考虑您正在做什么

此外,如果您正在寻找一种语言的原始循环性能,PHP应该是您最后的选择。它被单独解释,不适合长时间运行的操作

大多数PHP编码器浪费无数个循环来连接字符串。这说明了过早的优化警告。我打赌,只要在echo语句中添加逗号,我就可以使您的性能加倍


使用XDebug或其他工具评测代码。找到你真正的瓶颈。循环不是吗。相信我。从来就不是这样。

我为php | architect写了一篇关于php中循环问题的文章。基本上,基准测试表明,循环开销没有显著影响。。。即使在使用我的惰性数字范围扩展时

IIRC,foreach比for循环慢2.9倍,只要排除内存和生成器函数的成本。如果循环的内容少于循环开销的2.9倍,那么您可能需要重新考虑您正在做什么

此外,如果您正在寻找一种语言的原始循环性能,PHP应该是您最后的选择。它被单独解释,不适合长时间运行的操作

大多数PHP编码器浪费无数个循环来连接字符串。这说明了过早的优化警告。我打赌,只要在echo语句中添加逗号,我就可以使您的性能加倍


使用XDebug或其他工具评测代码。找到你真正的瓶颈。循环不是吗。相信我。从来没有过。

我知道这已经有好几年了,但我需要为未来的谷歌用户指出一点:

foreach要求加载和完成从中提取的数据,例如,要循环的数组已经在内存中

而只需要一个值就可以是数据或伪磨 让她继续循环。正确编程循环,while循环只需要加载下一个值,而不是整个数据集。因此,如果您对while循环进行编程以从函数中提取数据,则可以显著减少内存使用

一个例子可能是遍历大型百万行数据库的每一行;使用foreach,您需要加载整个数据集来执行循环,这将消耗您的内存。但是使用一个只提取下一行的函数,您将成功地完成循环

下面的伪代码解释:

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

我知道这已经有好几年了,但我需要为未来的谷歌用户指出一点:

foreach要求加载和完成从中提取的数据,例如,要循环的数组已经在内存中

而只需要一个值就可以是data或false——是否继续循环。正确编程循环,while循环只需要加载下一个值,而不是整个数据集。因此,如果您对while循环进行编程以从函数中提取数据,则可以显著减少内存使用

一个例子可能是遍历大型百万行数据库的每一行;使用foreach,您需要加载整个数据集来执行循环,这将消耗您的内存。但是使用一个只提取下一行的函数,您将成功地完成循环

下面的伪代码解释:

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

与循环体中的内容相比,几乎可以忽略不计……从理论角度来看,这不是一个有趣且有效的问题,但在实践中,您会注意到它们之间的任何性能差异都不会是任何减速的根本原因。另一方面,由于不同语言中的语言和foreach工作方式的不同,使得这种语言不可知使得回答起来有点困难。我可能会删除语言不可知标记以获得清晰的理解。与循环体中的内容相比,几乎可以肯定可以忽略不计……不是这样,从一个角度来看,这个问题是不有趣和有效的从理论上讲,但在实践中,您会注意到它们之间的任何性能差异都不会是任何减速的根本原因,由于for和foreach在不同语言中的工作方式不同,将此语言设置为不可知会使回答有点困难。我可能会删除语言不可知标记以获得清晰的理解。for循环不需要提前知道大小time@warren:你指的是一个C型循环。这就是为什么语言不可知论在这里没有任何帮助。许多类型的for循环不需要知道——而且我见过的每个人都可以以某种方式被打破,所以使其灵活通常并不太难a for循环不需要提前知道大小time@warren:你指的是一个C型循环。这就是为什么语言不可知论在这里没有任何帮助。许多类型的for循环不需要知道——而且我见过的每个人都可以以某种方式被打破,所以使其灵活通常并不难