为什么ImmutableList<T>的枚举器速度比List<T>慢这么多?

9
我有一段代码,经常遍历一个小列表。鉴于这个列表在运行时不会改变,我将其实现替换为ImmutableList<T>。通过dotTrace查看性能跟踪,发现它的性能比普通的List<T>差得多:

dotTrace Result (左边是List<T>,右边是ImmutableList<T>

为什么会出现这种情况,是否有解决方法?

@PeterDuniho 不是用来修改列表的,而是用来迭代它的。 - JohnD
两种情况下的缓慢原因是相同的。所以,你的意思是说,如果在发布自己的问题之前阅读了其他帖子的答案,你仍然无法自己弄清楚ImmutableList<T>List<T>慢得多的原因?有趣。 - Peter Duniho
@PeterDuniho 是的,因为那些问题是关于修改性能差(我预计会很糟糕)的,所以我忽略了它们,认为它们与我的问题不相关。 - JohnD
抱歉,我不明白你“没有阅读”问题及其答案如何与确定问题及其答案是否确实回答了你自己的问题有关,进而是否是该问题及其答案的重复。重复与否是两个问题之间的简单事实关系,完全不受你自己(或任何其他人)的行为影响。 - Peter Duniho
3
我创建了这个问题并回答它,因为这是我遇到的一个具体问题(不是你链接的那个问题中问到的内容),而我分享了一个具体的答案。我不同意认为因为在两个问题中都得出了关于ImmutableList<T>的相同结论,所以这是一个重复的问题。我知道没有一个问题能够匹配我的具体情况(迭代性能),所以我创建并回答了这个问题来填补这个空白。 - JohnD
1个回答

20
与使用需要随时调整大小的数组的List<T>不同,ImmutableList<T>在内部使用一个不可变的AVL树请参见Channel9视频讨论此问题)。
那么如何使用Immutable Collections来实现这个目的呢? 使用ImmutableArray<T> 引用自.NET Framework博客文章关于Immutable Collections的内容:
原因使用不可变数组:
  • 更新数据很少或元素数量相当小(<16)
  • 您需要能够在性能关键的部分中遍历数据
  • 您有许多不可变集合的实例,无法承担将数据保存在树中的成本
原因坚持使用不可变列表:
  • 更新数据是常见的或元素的数量不会很小
  • 更新集合比遍历内容更关键

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接