ImmutableList <t> </t>的性能特征

时间:2014-07-16 11:31:54

标签: .net big-o asymptotic-complexity immutablelist

是否记录了ImmutableList<T>的性能特征?我对渐近复杂度(big-O)感兴趣。 msdn链接并没有多少显示出来。

我知道Addthis[]都是O(log n)from this article,但我也想知道RemoveInsert。< / p>


我还希望在新引入的System.Collections.Immutable命名空间中看到整个类型的复杂性。

1 个答案:

答案 0 :(得分:2)

嗯,基于对代码的一些检查,我希望RemoveAtRemove必须先找到项目)和Insert几乎相同Add。基本原理是一样的。我更担心的是内存使用模式和类似的东西 - 如果你并排使用一些ImmutableList并进行大量的添加和删除,我会#39 ; d期望您可能很快遇到数据位置问题,这会导致您的性能直线下降。 AddRange主要是一个快捷方式,它实际上只调用了一堆Node.Add,节省了一些开销,但并不多。还有很多递归。

ImmutableArray不会导致这种情况,因为它总是创建一个全新的数组并复制旧数组。因此它会导致大量内存复制和分配/收集,但性能也会更加稳定 - 访问时间不随使用情况而变化,修改数组时甚至没有任何快捷方式,你总是要复制所有的项目。这也意味着只需要使用AddRange添加多个项目 - 性能差异将是巨大的。 Add是使用Insert在内部实施的,所以目前它是相同的。换句话说,所有更改操作都是o / O(n),而read是o / O(1)。

总而言之,ImmutableList更关注频繁更改和牺牲读取性能,而ImmutableArray主要用于大量读取,并且相对较少的更改。