Подтвердить что ты не робот

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

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

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

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;
}
4b9b3361

Ответ 1

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

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

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