我有一段代码经常迭代一个小列表。鉴于列表在运行时从不更改,我将实现替换为ImmutableList<T>
. 查看 dotTrace 的性能跟踪,这比正常的性能差得多List<T>
:
(List<T>
在左边,ImmutableList<T>
在右边)
为什么会发生这种情况,是否有解决方法?
我有一段代码经常迭代一个小列表。鉴于列表在运行时从不更改,我将实现替换为ImmutableList<T>
. 查看 dotTrace 的性能跟踪,这比正常的性能差得多List<T>
:
(List<T>
在左边,ImmutableList<T>
在右边)
为什么会发生这种情况,是否有解决方法?
与List<T>
环绕根据需要调整大小的数组不同,ImmutableList<T>
内部使用不可变的AVL 树(参见 Channel9 视频讨论)。
引用关于不可变集合的.NET Framework 博客文章
使用不可变数组的原因:
- 很少更新数据或元素数量很少(<16)
- 您需要能够迭代性能关键部分中的数据
- 您有许多不可变集合的实例,并且无法将数据保存在树中
坚持使用不可变列表的原因:
- 更新数据很常见或预计元素数量不会很少
- 更新集合比迭代内容更重要