Выделения в вашем методе Explode
происходят из-за внутренней работы самого итератора, а не из-за упаковки.
Каждый блок итератора реализуется компилятором с использованием ссылочного класса для поддержания состояния, котороеиспользуется в ходе итерации по IEnumerable
, в вашем случае с foreach
.Обычно выделение этого класса не замечается как проблема, потому что итератор выполняет итерации по большой коллекции, или клиент, выполняющий итерацию, выполняет существенную собственную работу или распределение, которое перебивает распределение итераторов.
Но если вашколлекция небольшая (как у вас), и foreach
очень быстрый и не имеет собственных выделений, все, что останется, - это выделение класса состояния итератора.
Чтобы решить эту проблему с производительностью, вы можете просто реорганизовать свой код, чтобы использовать for
вместо foreach
, когда бы профилировщик сообщал вам, что в блоке итератора выделяется много памяти.Обычно это скромное изменение, и повышение производительности, если его можно измерить, того стоит.