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