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
)。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈