Преимущества параллелизма или производительности доходности над возвратом списка - PullRequest
19 голосов
/ 16 ноября 2008

Мне было интересно, есть ли какой-либо параллелизм (сейчас или в будущем) или выигрыш в производительности при использовании доходности по сравнению с возвратом списка. Смотрите следующие примеры

Способ обработки

void Page_Load()
{
  foreach(var item in GetPostedItems())
    Process(item);
}

с использованием доходности

IEnumerable<string> GetPostedItems()
{
  yield return Item1.Text;
  yield return Item2.Text;
  yield return Item3.Text; 
}

возврат списка

IEnumerable<string> GetPostedItems()
{
  var list = new List<string>();
  list.Add(Item1.Text);
  list.Add(Item2.Text);
  list.Add(Item3.Text);
  return list;
}

1 Ответ

40 голосов
/ 16 ноября 2008

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

Одна из замечательных особенностей yield return заключается в том, что вы можете возвращать бесконечные последовательности, случайные последовательности и все виды других новых перечислений, которые либо будут крайне неэффективными, либо невозможными для модели создания списка вначале. 1010 *

Проще говоря, для возврата экземпляра List требуется, чтобы все элементы в списке были оценены до возврата IEnumerable, тогда как использование yield return позволяет вычислять каждый элемент в соответствии с требованиями потребителя. IEnumerable.

...