gpt4 book ai didi

C# List 与 IEnumerable 性能问题

转载 作者:可可西里 更新时间:2023-11-01 03:04:28 25 4
gpt4 key购买 nike

你好,假设这两种方法:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com