Enumerable.ElementAt 查找缓慢

本文介绍 Enumerable.ElementAt 的性能见解。

原因

使用 Enumerable.ElementAt 扩展方法时,该方法会尝试利用基础容器的快速查找机制(如果可用),例如具有 O(1) 访问权限的 List<T>.Item[]。 如果不可用,该方法将计算从集合开头开始的可枚举值,并枚举到所需的元素,从而导致 O(n) 访问。

性能见解说明

Enumerable.ElementAt 扩展方法旨在尝试并使用可用的最快访问权限来访问指定元素。 对于基础集合(例如 List<T>),它可以使用具有 O(1) 访问时间的 List.Item[] 直接访问。 如果基础集合不支持直接访问,例如来自 yield 语句LinkedList<T>IEnumerable<T>,则它必须从集合的开头开始并循环访问,直到找到所需的索引,从而生成 O(n) 查找时间。 如果触发此警告,则使用更好的集合可以提高性能。

如何调查警告

在 CPU 使用率工具中,单击“查看源代码”以转到调用树和源行突出显示视图,该视图显示 Enumerable.ElementAt 中花费最多时间的位置。 从这一点开始,追溯到创建基础可枚举集合的位置,并调查是否可改为使用更合适的数据结构(例如 List)。

另请参阅

使用火焰图识别热路径