Почему генератор php работает медленнее, чем foreach?


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

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

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

Author: szymanskilukasz, 2014-06-28

1 answers

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

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

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

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

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

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

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

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

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

time: 5.2702
memory (byte): 1495269376

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

time: 1.9010
memory (byte): 262144

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

 7
Author: Christian P, 2016-08-03 17:03:28