Реализация итераторов компилятором действительно использует объекты класса, и использование (с foreach, например) итератора, реализованного с yield return
, действительно приведет к выделению памяти.В схеме вещей это редко является проблемой, потому что либо выполняется значительная работа во время итерации, либо выделяется значительно больше памяти для выполнения других задач во время итерации.
Чтобы память, выделенная итератором, стала проблемой,Ваше приложение должно быть интенсивно структурировано, а ваши алгоритмы должны работать с объектами без выделения памяти.Подумайте о игре жизни о чем-то похожем.Внезапно это - итерация, которая сокрушает.И когда итерация выделяет память, может быть выделено огромное количество памяти.
Если ваше приложение соответствует этому профилю (и только если), то первое правило, которому вы должны следовать:
- избегайте итераторов во внутренних циклах, когда доступна более простая концепция итерации
Например, если у вас есть массив или список, подобный структуре данных, вы уже выставляете свойство индексатора и свойство count, чтобы клиенты могли простоиспользуйте цикл for вместо использования foreach с вашим итератором.Это «легкие деньги» для уменьшения GC, и это не делает ваш код уродливым или раздутым, просто немного менее элегантным.
Второй принцип, которому вы должны следовать:
- измерьте распределение памяти, чтобы увидеть, когда и где вы должны использовать первое правило