首先,我理解在90%的应用程序的性能差异是完全不相关的,但我只需要知道哪个是更快的构造。那和…
目前在网上可以得到的信息是混乱的。很多人说foreach是坏的,但在技术上它应该更快,因为它假设简化使用迭代器编写数组遍历。迭代器,它们又假定要更快,但在PHP中也显然死了慢(或者这不是一个PHP东西?)。我在谈论数组函数:next()prev()reset()等,好吧,如果他们是偶数的函数,而不是那些看起来像函数的PHP语言特性。
要缩小这一点:我不是有趣的遍历数组的步骤任何超过1(没有负步骤,即反向迭代)。我也不感兴趣的遍历到任意点,只是0到长度。我也没有看到操作数组超过1000个键发生在定期,但我看到一个数组在应用程序的逻辑中被多次遍历!此外,对于操作,很大程度上只有字符串操作和回声。
我到处听到什么:
> foreach是慢的,因此for / while更快
> PHP foreach复制它迭代的数组;使它更快你需要使用引用
>代码如下:$ key = array_keys($ aHash); $ size = sizeOf($ key); for($ i = 0; $ i
这里是我的问题。我写了这个测试脚本: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比用于哈希表快
有人可以解释吗?
>我做错了什么?
>是PHP的foreach引用的东西真的有所作为吗?我的意思是,为什么不复制它,如果你通过引用?
> foreach语句的等价迭代器代码是什么?我看到了几个在网上,但每次我测试他们的时间是关闭;我也测试了几个简单的迭代器结构,但似乎没有得到更好的结果 – 在PHP的数组迭代器是可怕的?
>有没有更快的方法/方法/结构来迭代除了FOR / FOREACH(和WHILE)之外的数组?
PHP版本5.3.0
编辑:答案
在这里的人的帮助下,我能够把所有问题的答案拼凑在一起。我将在这里总结一下:
>“我做错了什么?共识似乎是:是的,我不能在基准中使用echo。就个人而言,我仍然没有看到echo是一些函数与随机的执行时间或任何其他函数是什么不同的 – 这和脚本的能力,只是产生完全相同的结果foreach比一切都更难解释,虽然只是“你使用echo”(我应该是什么应该使用)。但是,我承认测试应该做更好的事情;虽然没有想到一个理想的妥协。
>“是PHP foreach引用的东西真的有所作为吗?我的意思是为什么它不复制它,如果你通过引用传递? ircmaxell表明,是的,进一步的测试似乎证明在大多数情况下引用应该更快 – 虽然给我上面的代码段,绝对不是所有的意思。我接受这个问题可能是太不直观的麻烦在这样的水平,并将需要一些极端,如反编译,以实际确定哪一个更好的每种情况。
>“foreach语句的等效迭代器代码是什么;我已经看到了一些在网上,但每次我测试他们的时机是关闭;我也测试了一些简单的迭代器结构,但似乎没有得到体面结果 – 在PHP中的数组迭代器只是可怕? ircmaxell提供了答案下面;尽管代码可能只对PHP版本> = 5有效
>“有没有更快的方法/方法/结构来迭代除了FOR / FOREACH(和WHILE)之外的数组?感谢你去Gordon的答案。在PHP5中使用新的数据类型应该提高性能或提高内存(根据你的情况,这可能是可取的)。虽然速度上许多新类型的数组似乎不比array()更好,splpriorityqueue和splobjectstorage似乎要快得多。链接提供Gordon:http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
谢谢大家谁尝试帮助。
我可能坚持foreach(非参考版本)任何简单的遍历。