当前位置:  开发笔记 > 编程语言 > 正文

并发或性能返回列表时yield收益的好处

如何解决《并发或性能返回列表时yield收益的好处》经验,为你挑选了1个好方法。

我想知道使用yield return而不是返回列表是否存在任何并发(现在或将来)或性能优势.请参阅以下示例

处理方法

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

使用收益率回报

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

返回一个清单

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

Jeff Yates.. 40

在该yield return示例中,在每次调用时评估结果,IEnumerable.MoveNext而在列表示例中,在IEnumerable返回之前评估所有结果(请注意,Text可能不会为每个结果评估属性,因为可以进行缓存和内联).因此,yield return您应该在第一次调用枚举器时获得较小的性能增强,然后在IEnumerable.MoveNext评估属性时对每次后续调用可能会略微降低性能.

其中一个重要的事情yield return是,您可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么无法使用先创建列表的模型.

简单地说,返回一个实例List需要在返回之前评估列表中的所有元素IEnumerable,而using yield return允许按照消费者的需要计算每个元素IEnumerable.



1> Jeff Yates..:

在该yield return示例中,在每次调用时评估结果,IEnumerable.MoveNext而在列表示例中,在IEnumerable返回之前评估所有结果(请注意,Text可能不会为每个结果评估属性,因为可以进行缓存和内联).因此,yield return您应该在第一次调用枚举器时获得较小的性能增强,然后在IEnumerable.MoveNext评估属性时对每次后续调用可能会略微降低性能.

其中一个重要的事情yield return是,您可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么无法使用先创建列表的模型.

简单地说,返回一个实例List需要在返回之前评估列表中的所有元素IEnumerable,而using yield return允许按照消费者的需要计算每个元素IEnumerable.


这将取决于列表的元素是什么以及评估每个值花了多少精力.如果列表中的每个元素都涉及打开一个500MB的文件,那么我会选择yield return方法,如果它只是一个简单的计算,那么列表可能会更好.
当您想要遍历文件系统时,yield return非常有用.
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有