FOR 与 FOREACH 在 PHP 中的性能
首先,我知道在90%的应用程序中,性能差异是完全无关紧要的,但我只需要知道哪个是更快的构造。那和...
目前网上关于他们的信息令人困惑。很多人说 foreach 不好,但从技术上讲,它应该更快,因为它应该简化使用迭代器编写数组遍历的过程。迭代器,它们再次被认为更快,但在PHP中显然也非常慢(或者这不是PHP的东西吗?我说的是数组函数:next() prev() reset() reset() 等,如果它们甚至是函数,而不是看起来像函数的PHP语言特性之一。
缩小一点范围:我对以超过1的步骤遍历数组不感兴趣(也没有负步骤,即反向迭代)。我对任意点之间的遍历也不感兴趣,只有0到长度。我也没有看到操作超过1000个键的数组定期发生,但我确实看到数组在应用程序的逻辑中被遍历多次!同样对于操作,很大程度上只是字符串操作和回声。
以下是一些参考网站:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
我到处听到的:
-
foreach
很慢,因此 /更快for
while
- PHPs 复制它循环访问的数组;为了加快速度,您需要使用引用
foreach
- 像这样的代码:比
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
这是我的问题。我写了这个测试脚本:http://pastebin.com/1ZgK07US,无论我运行脚本多少次,我都会得到这样的东西:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
总之:
-
foreach
比参考更快foreach
-
foreach
速度快于for
-
foreach
比哈希表更快for
有人可以解释吗?
- 我做错了什么吗?
- PHP foreach 引用的东西真的有区别吗?我的意思是,如果你通过引用,为什么它不会复制它?
- foreach 语句的等效迭代器代码是什么;我在网上看到过一些,但每次我测试它们时,时机都偏离了。我还测试了一些简单的迭代器结构,但似乎从未得到过像样的结果 - PHP中的数组迭代器很糟糕吗?
- 是否有更快的方法/方法/构造来迭代FOR/FOREACH(和WHILE)以外的数组?
PHP 版本 5.3.0
编辑:答案在這裡的人的幫助下,我能夠拼擬出所有問題的答案。我将在这里总结它们:
- “我做错了什么吗?”共识似乎是:是的,我不能在基准测试中使用回声。就个人而言,我仍然不明白echo是如何成为一些具有随机执行时间的函数,或者任何其他函数如何以某种方式有所不同 - 并且该脚本生成完全相同的foreach结果的能力比所有内容都好,尽管只是“你正在使用echo”(好吧,我应该使用什么)。但是,我承认测试应该用更好的东西来完成;虽然没有想到理想的妥协。
- “PHP foreach 引用的东西真的有所作为吗?我的意思是,如果你通过引用,它为什么不复制它呢?”ircmaxell表明是的,进一步的测试似乎证明在大多数情况下参考应该更快 - 尽管考虑到我上面的代码片段,绝对不意味着全部。我承认这个问题可能太不直观了,无法在这样的层面上打扰,并且需要一些极端的东西,例如反编译才能真正确定哪种情况更好。
- “foreach 语句的等效迭代器代码是什么;我在网上看到过一些,但每次我测试它们时,时机都偏离了。我还测试了一些简单的迭代器结构,但似乎从未得到过像样的结果 - PHP中的数组迭代器很糟糕吗?ircmaxell在下面提供了答案;尽管代码可能仅对 PHP 版本有效 >= 5
- “是否有更快的方法/方法/构造来迭代FOR/FOREACH(和WHILE)以外的数组?”谢谢戈登的答案。在 PHP5 中使用新的数据类型应该会带来性能提升或内存提升(根据您的情况,这两者中的任何一个都是可取的)。虽然在速度方面,许多新型阵列似乎并不比 array() 更好,但 splpriorityqueue 和 splobjectstorage 似乎确实快得多。链接由Gordon提供:http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
对于任何简单的遍历,我可能会坚持foreach(非参考版本)。