【发布时间】:2012-06-07 15:05:22
【问题描述】:
What is the expected performance of IEnumerable? 的答案说没有办法知道迭代任意 IEnumerable 的性能。每次迭代都可以访问数据库或进行网络服务调用;或者它可能只返回数组/列表中的下一项。
鉴于此,有没有一种表示“这很快”的好方法?例如,使用T[] 或List<T> 而不是IEnumerable<T> 我知道从T[i] 到T[i+1] 会很快。 (当然,强制枚举返回列表/数组可能会产生其他性能问题。List<T> 还公开了可编辑语义。)
相反,返回IQueryable<T> 而不是IEnumerable<T> 是表示“这很慢”的好方法吗?或者IEnumerable<Task<T>>?
C 的客户无法知道IEnumerable<T>s 将具有截然不同的性能特征。
class C
{
readonly T[] m_data;
public IEnumerable<T> ThisWillIterateQuickly { get { return m_data; } }
public IEnumeralbe<T> ThisWillIterateSlowly
{
get
{
T retval = ... an expensive database call ...;
yield return retval;
}
}
public IQueryable<T> IsThisBetterForSlow { get { return ThisWillIterateSlowly; } }
public T[] IsThisAGoodWayForFast { get { return m_data; } }
}
【问题讨论】:
-
这可能听起来很模糊,但只有如果您认为它不够足够快,它就会很慢。
-
没有标准的广告机制。也许只是:文档?
-
Re IQueryable... 数组可以作为 IQueryable 公开 - 它没有说明性能
-
鉴于您似乎暗示您有多个包含相同数据的数据结构,并且您需要区分快速结构和慢速结构......您可能想看看为什么您正在这样做,并且一直使用更快的结构?
-
@LukeH 当然,当
IReallyFastEnumerable<>导致性能问题并且您最初忽略它时,这一切都会分崩离析,因为您认为它确实按照锡上所说的那样......虽然很可爱;-)
标签: .net performance ienumerable iqueryable