为什么php生成器比foreach慢?

时间:2014-06-28 09:17:06

标签: php performance foreach generator

根据文件的评论:http://php.net/manual/en/language.generators.overview.php
我们可以看到,由于生成器有大量的内存使用改进(这很明显),但执行速度也慢了2-3倍 - 这对我来说并不那么明显。

我们以牺牲时间为代价来提高内存使用率 - 这并不好 那么,为什么php生成器比foreach慢?

感谢您的提示。

1 个答案:

答案 0 :(得分:10)

在计算机科学中,在进行优化时,你必须在执行速度和内存使用之间做出选择,即预先计算某些内容并将其存储,或者只在需要时进行计算。

  

生成器允许您编写使用foreach迭代的代码   一组数据,无需在内存中构建数组,这可能是   导致您超出内存限制,或需要相当大的数量   处理时间来生成

本手册可能指的是您不会迭代使用生成器生成的所有结果的情况。速度效益将来自于您不需要通过生成您不需要的项目来浪费处理时间和内存。

此外,发电机并未设计用于替换阵列。它们旨在作为一种在实现Iterator对象时减少样板代码的方法。

将数组与数组进行比较时,生成器总是会变慢,因为每次调用next()以保存内存时,生成器都必须生成值。

修改

我有点好奇,所以我在xrange(使用生成器实现,如PHP manual page)和内置range函数之间进行了快速而肮脏的比较。

我的机器上的结果(使用PHP 5.6测试)是:

范围(1,10000000,1):

time: 5.2702
memory (byte): 1495269376

xrange(1,1000000,1):

time: 1.9010
memory (byte): 262144

请注意"基准"代码我正在使用 迭代所有结果并进行简单的数学运算。如上所示,函数调用仅用作我正在测试的值的参考。像往常一样,使用像这样的简单基准,YMMV。