Почему генератор PHP медленнее, чем массив?

Согласно комментариям из документации: http://php.net/manual/en/language.generators.overview.php
Мы можем видеть, что благодаря генераторам значительно улучшилось использование памяти (что очевидно), но при этом также выполняется в 2-3 раза медленнее - и это не так очевидно для меня.

Мы получаем улучшение использования памяти за счет времени - что не очень хорошо.
Итак, почему генератор php медленнее, чем массив?

Спасибо за советы.

Ответ 1

В компьютерных науках, когда вы выполняете оптимизацию много раз, вам придется выбирать между скоростью выполнения и использованием памяти, то есть предварительным вычислением чего-либо и его сохранением, или просто выполнением вычислений, когда они вам нужны.

Генератор позволяет вам писать код, который использует foreach для итерации по набору данных без необходимости создавать массив в памяти, что может привести к превышению лимита памяти или значительному времени обработки для генерации

Руководство, вероятно, относится к ситуации, когда вы не будете перебирать все результаты, которые вы генерируете с помощью вашего генератора. В этом случае выигрыш в скорости будет заключаться в том, что вам не нужно тратить время и память на обработку, создавая ненужные вам элементы.

Кроме того, генераторы не были предназначены для замены массивов. Они были предназначены для уменьшения стандартного кода при реализации объектов Iterator.

Генераторы всегда будут медленнее при сравнении их с массивами, потому что генератор должен генерировать значения каждый раз, когда вы вызываете next() чтобы сохранить память.

редактировать

Мне было немного любопытно, поэтому я сделал быстрое и грязное сравнение между xrange (реализованным с помощью генераторов, как на странице руководства PHP) и встроенной функцией range.

Результаты на моей машине (протестировано с PHP 5.6) были:

диапазон (1, 10000000, 1):

time: 5.2702
memory (byte): 1495269376

xrange (1, 10000000, 1):

time: 1.9010
memory (byte): 262144

Обратите внимание, что используемый мной "эталонный" код перебирает все результаты и выполняет простые математические операции. Вызовы функций, как показано выше, служат только для ссылок на значения, с которыми я тестировал. Как всегда, с такими простыми тестами, как YMMV.