Использование памяти итераторами в C # - PullRequest
6 голосов
/ 22 августа 2009

Как влияет на использование памяти использование большого количества итераторов в C #? Давайте предположим, что программа выполняет тысячи циклов foreach - выделяет ли каждый цикл временный объект в куче посредством вызова GetEnumerator? Осуществляет ли CLR какую-либо оптимизацию (например, выделение стека IEnumerator объектов)? Или это просто не настолько серьезная проблема, чтобы о ней беспокоиться?

Ответы [ 2 ]

14 голосов
/ 22 августа 2009

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

Если вы выполняете сотни тысяч foreach циклов, возможно, вы выполняете работу внутри этих циклов. Это почти наверняка будет намного более важным, чем сами итераторы.

Обратите внимание, что использование foreach над массивом (то есть известным как массив во время компиляции) не использует IEnumerable<T> в любом случае - оно использует прямую индексацию. Я бы не стал менять свой код на основании этого.

Как всегда, если вы беспокоитесь о производительности, вам нужно измерить ее и профилировать. Узкие места почти никогда не бывают такими, как вы ожидаете.

2 голосов
/ 22 августа 2009

Часто компилятор может оптимизировать цикл foreach в простой цикл, для которого требуется только индексная переменная в стеке (или в регистре процессора).

Если итератор все еще используется, большинство из них являются структурами, поэтому они просто размещаются в стеке, а не в куче.

Несколько итераторов, которые являются классами, все еще довольно малы и быстры. Вы можете создать миллионы из них без заметного воздействия.

...