C# List<T> 与 IEnumerable<T> 性能问题

标签 c# performance list ienumerable

你好,假设这两种方法:

private List<IObjectProvider> GetProviderForType(Type type)
        {
            List<IObjectProvider> returnValue = new List<IObjectProvider>();

            foreach (KeyValuePair<Type, IObjectProvider> provider in _objectProviders)
            {
                if ((provider.Key.IsAssignableFrom(type) ||
                    type.IsAssignableFrom(provider.Key)) &&
                    provider.Value.SupportsType(type))
                {
                    returnValue.Add(provider.Value);
                }
            }
            return returnValue;
        }

private IEnumerable<IObjectProvider> GetProviderForType1(Type type)
        {
            foreach (KeyValuePair<Type, IObjectProvider> provider in _objectProviders)
                if ((provider.Key.IsAssignableFrom(type) ||
                    type.IsAssignableFrom(provider.Key)) &&
                    provider.Value.SupportsType(type))

                    yield return provider.Value;              
        }

哪个更快?当我查看第一种方法时,我看到内存是为 List 分配的,在我看来这是不需要的。 IEnumerable 方法对我来说似乎更快。

例如,假设你调用

int a = GetProviderForType(myType).Count;
int b = GetProviderForType1(myType).Count();

现在,另一个问题是,上述两者之间是否存在性能差异?

你怎么看?

最佳答案

在这种特殊情况下,使用 IEnumerable<T> form 会更有效率,因为你需要知道计数。如果不需要,存储数据、调整缓冲区大小等都是没有意义的。

如果您出于任何原因需要再次使用结果,List<T>形式会更有效率。

请注意 Count()扩展方法和 Count属性将对 List<T> 有效作为 Count() 的实现检查目标序列是否实现了 ICollection<T>并使用 Count如果是这样的话。

另一个应该更有效(尽管只是)的选项是调用 Count 的重载。这需要一个代表:

private int GetProviderCount(Type type)
{
  return _objectProviders.Count(provider =>
      (provider.Key.IsAssignableFrom(type) 
       || type.IsAssignableFrom(provider.Key))
      && provider.Value.SupportsType(type));
}

这将避免 Where 引起的额外级别的间接寻址和 Select条款。

(正如 Marc 所说,对于少量数据,性能差异可能无论如何都可以忽略不计。)

关于C# List<T> 与 IEnumerable<T> 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1211491/

相关文章:

c# - 实体的主键字段设置为 0 而不是 null

SQL 语句耗时较长

performance - 为什么在评估算法效率时通常将比较作为基本操作?

r - 将类似命名的不等长列表元素转换为数据框 R

C# System.Windows.Forms.Timer EventHandler 未被调用

c# - 哪个是最好的 OLEDB 或 Excel 对象或数据库

java - 并行垃圾收集器是否与主程序一起在单独的线程上运行

python - Python逗号分隔列表

android - 所有具有特征的 Android 设备列表

c# - LINQ: 'Select c' 和 'Select new (c...' 之间的区别