首先,我了解90%的应用程序中的性能差异完全无关紧要,但是我只需要知道哪个是更快的构造即可。那...
当前网上可用的信息令人困惑。许多人都说foreach不好,但是从技术上讲应该更快,因为它假设可以简化使用迭代器编写数组遍历的过程。再次被认为是更快的迭代器,但是在PHP中显然也很慢(或者这不是PHP吗?)。我说的是数组函数:next()prev()reset()等,如果它们甚至是函数,而不是那些看起来像函数的PHP语言功能之一。
稍微缩小一点:我对以大于1的步长遍历数组并不感兴趣(也没有负步长,即反向迭代)。我对遍历任意点(长度仅为0)也不感兴趣。我也看不到有规则地操纵具有1000个以上键的数组,但是我确实看到一个数组在应用程序的逻辑中被遍历了多次!此外,对于操作,主要仅是字符串操作和回显。
以下是一些参考站点:
http : //www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
我到处都能听到:
foreach
慢,因此for
/while
快- PHP
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(非参考版本)。