Pull to refresh

Comments 11

Основное преимущество генераторов не в экономии памяти, а в удобстве.

В удобстве при неизменной памяти. Или в памяти при неизменном удобстве.


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

Так об этом статья и рассказывает. Автор пытается подчеркнуть, что суть генератора не в экономии памяти, а в возможности добиться этой экономии при более лучшем качестве кода и удобстве его написания. Казалось бы, и в чём прикол? А в том, чтобы не путать причину и следствие.

А причины и следствия тут и нет, есть лишь закономерность.

Картинка для привлечения внимания вкупе в комплекте с заголовком вызывают изрядное зависание.
Которое токмо усиливается при прочтении первого абзаца... :)

Смотришь по понятный и привычный небольшой электро-генератор, пытаешь осмыслить - причём тут человеческая память...

Потом прочитываешь первый абзац и вааще ничего не понимаешь - PHP-то тут причём :)

Видимо - слишком глубоко в ЦОДо-строение ушёл. ДГУ мне ближе PHP стал :)

Ну как бы при обработке запроса не обязательно всё сразу парсить в массив а можно парсить «построчно» и отдавать на обработку как генератор. Тогда точно будет экономия памяти. Я так делал.

Ну тут суть в том, что и без генератора можно не парсить всё сразу в массив, а сразу и обрабатывать на месте, читая через цикл while.
С генератором оно просто будет гораздо красивее и гибче — цикл можно взять и передать в другое место, которое вообще не будет знать, откуда берутся данные, а думать что работает с массивом. Генератор как бы "выворачивает цикл наизнанку" — с ним вся работа происходит не внутри цикла, а снаружи. А так-то внутри у него то же самый while и сидит.

Используя возможности производительности процессора, можно получить выигрыш в памяти. Используя размеры памяти, можно получить выигрыш в производительности. Но и то и другое, не меняя железо - никак.

У генераторов есть еще одна, менее очевидная область использования - генератор создает корутину, отдельный (но не параллельный) поток выполнения. Эта фича была основой асинхронного програмирования на php почти 10 лет. Сейчас вроде как файберы могу забрать на себя эту функцию, но раз уж завели разговор про то, чем полезны генераторы, упомянуть стоит

Не совсем понял почему в указанном примере в функцию sum_even_values отправлен весь цикл foreach, а не обработка одного элемента. В таком случае всё будет прекрасно работать и без генераторов, и источники данных можно легко менять без лишнего повторения кода. Т.е. опять никакого преимущества у генераторов особо нет в таком использовании, или я что-то недопонял?

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


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


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

Если не нравится static $var в функции, то можно сделать через метод класса. В случае с "большими данными" подобное разделение логики может сказаться негативно, т.к. факт того, что в sum_even_values можно отправлять только "правильные" массивы, априори находится исключительно в голове автора такой функции, если, конечно, он не пишет очень расширенные комментарии к коду, а все его коллеги не перечитывают их каждый раз. Получается логика формально разделена, но у всей команды в голове постоянно должно быть понимание что и как можно слать, что, на мой взгляд, хуже, чем отсутствие такого разделения. Но это, конечно же, субъективно.

Sign up to leave a comment.

Articles