【问题标题】:What is the expected performance of IEnumerable?IEnumerable 的预期性能是多少?
【发布时间】:2012-06-05 21:33:48
【问题描述】:

属性的性能应该与字段类似,即使它们实际上是函数。关于任意IEnumerable 的预期性能可以说什么?

从属性中借用这个概念并说IEnumerable 应该与迭代数组或List<T> 执行大致相同是否公平?

或者,每次迭代都会发生任何事情是否可以:数据库访问、Web 服务调用、耗时的计算等。

【问题讨论】:

  • 迭代是O(n),用于一些神奇的未指定C。当然,类型系统不能说“需要多长时间”,而不是for (var i in list) { doStuff(i); }。这些是应该在文档中指定的软模糊规则。

标签: .net performance ienumerable


【解决方案1】:

根据经验,您无法真正推断出任意IEnumerable 的性能。例如,它可能是伪装的IQueryable,每次枚举时都会访问数据库。或者它可能是File.EnumerateLines 的结果。

有时重要的是可枚举只枚举一次。

这与属性相反。如果属性要访问数据库或读取 I 文件,我会认为这是代码异味。对于IEnumerable,这很正常。

【讨论】:

  • 是的,没错。高延迟 IEnumerable 的例子太多了。在实践中经常出现。
【解决方案2】:

我想说的是,对于 IEnumerable<T> 的性能应该没有规定 - 只是关于它应该如何表现,这意味着它应该在你的集合中循环。

如果您需要在迭代开始时访问数据库(如 Entity Framework 的 IQueryable<T>),那很好 - 如果它需要对每个项目进行数据库或文件调用,那很好。对我来说唯一重要的是你可以循环播放它。

【讨论】:

    【解决方案3】:

    IEnumerable 没有属性,但如您所知,IEnumerable 返回一个 IEnumerator。

    如果您的对象公开了一个 IEnumerable 类型的属性,该属性预计会在恒定时间内返回,但 该枚举器的枚举应该没有预期。

    当然,您的情况可能会有所不同。例如,如果您将一些 WPF 控件绑定到该枚举,您的用户会希望它快速返回。

    【讨论】:

    • 我认为返回IEnumerable 的属性不会有任何“恒定时间”期望,因为thing.property.action1(); thing.property.action2(); 不应该比var foo = thing.property; foo.action1(); foo.action2(); 慢很多。 IEnumerable 属性是否应该有超出此范围的期望?
    【解决方案4】:

    IEnumerable 当然可以用来访问数据库或爬取文件,但是如果你暴露了这样的IEnumerable,你应该清楚地记录它这样做。

    如果不能立即明确它很昂贵,则应适当封装它,并且只公开内存中的枚举。

    【讨论】:

    • 当然有一个不言自明的类和属性名称,以及准确描述它们的作用的 XML cmets。
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2010-09-20
    • 2011-02-14
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多