.net – ImmutableList的性能特征

是在某处记录了
ImmutableList<T>的性能特征吗?我对渐近复杂度感兴趣(big-O). msdn链接没有透露太多信息.

我知道Add和this []都是O(log n)from this article,但我也想知道Remove和Insert.

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

最佳答案 好吧,基于对代码的一些检查,我希望RemoveAt(删除必须先找到项目)和Insert与Add几乎相同.基本原理是一样的.我更担心的是内存使用模式和类似的东西 – 如果你并排使用一些不可变列表并进行大量添加和删除,我希望你可能会很快遇到数据地方问题,这会导致你的表现直线下降. AddRange主要是一个快捷方式,它实际上只调用了一堆Node.Adds,节省了一些开销,但并不多.还有很多递归.

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

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

点赞