你好,假设这两种方法:
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/