与List <T>相比,为什么ImmutableList <T>的枚举器要慢得多

Joh*_*hnD 4 c# immutablelist immutable-collections

我有一段代码经常迭代一个小列表.鉴于列表在运行时期间永远不会更改,我将实现替换为ImmutableList<T>.通过dotTrace查看性能跟踪,这比正常情况要糟糕得多List<T>:

dotTrace结果 (List<T>左,ImmutableList<T>右)

为什么会发生这种情况并且有解决方法?

Joh*_*hnD 10

List<T>根据需要调整大小的数组包装不同,ImmutableList<T>内部使用不可变的AVL树(请参阅Channel9视频讨论此内容).

那么我怎样才能使用Immutable Collections实现这一目标呢?

使用ImmutableArray<T>.

.NET Framework博客文章中引用有关Immutable Collections的信息

使用不可变数组的原因:

  • 更新数据很少或元素数量很少(<16)
  • 您需要能够在性能关键部分中迭代数据
  • 你有许多不可变集合的实例,你无法负担将数据保存在树中

坚持使用不可变列表的原因:

  • 更新数据很常见,或者元素数量预计不会很小
  • 更新集合比迭代内容更具性能要求