Re[5]: Как ускорить yield return?
От: Пельмешко Россия blog
Дата: 22.02.10 18:51
Оценка: 9 (1)
Здравствуйте, Sinix, Вы писали:

S> Правда я вообще не представляю, как yield many может повлиять на производительность.


Вот так:


Попробуйте на нынешних итераторах что-нибудь сильно рекурсивное написать, тогда может даже невооружённым глазом заметна будет разница

Образно говоря, с yield return получается, что внутри итератора стек из специальных энумераторов, которые могут вернуть либо значение, либо энумератор (либо ещё хвостовой энумератор). Если на MoveNext() энумератор возвращает энумератор, то его запихивают в вершину стека и перебирают дальше его. По завершению перебора энумератор выбрасывается из вершины стека и перебор продолжается, если в стеке есть ещё энумераторы.

То есть если у Вас сейчас итератор вызвал сам себя (или другой итератор) 1000 раз, то чтобы получить очередное значение, надо добраться до энумератора, который вложен в 1000 экземпяров итераторов — MoveNext() и get_Current() будет вызваны 1000 раз... А у yield return-итератора нужный энумератор всегда лежит на вершине стека, один MoveNext() считай...

На графике у итератора квадратичная сложность, но я что-то не догоняю почему
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.