Преимущества параллелизма или производительности доходности по сравнению с возвратом списка

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

Метод обработки

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 ответ

Решение

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

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

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

Другие вопросы по тегам