是否记录了ImmutableList<T>
的性能特征?我对渐近复杂度(big-O)感兴趣。 msdn链接并没有多少显示出来。
我知道Add
和this[]
都是O(log n)from this article,但我也想知道Remove
和Insert
。< / p>
我还希望在新引入的System.Collections.Immutable
命名空间中看到整个类型的复杂性。
答案 0 :(得分:2)
嗯,基于对代码的一些检查,我希望RemoveAt
(Remove
必须先找到项目)和Insert
几乎相同Add
。基本原理是一样的。我更担心的是内存使用模式和类似的东西 - 如果你并排使用一些ImmutableList
并进行大量的添加和删除,我会#39 ; d期望您可能很快遇到数据位置问题,这会导致您的性能直线下降。 AddRange
主要是一个快捷方式,它实际上只调用了一堆Node.Add
,节省了一些开销,但并不多。还有很多递归。
ImmutableArray
不会导致这种情况,因为它总是创建一个全新的数组并复制旧数组。因此它会导致大量内存复制和分配/收集,但性能也会更加稳定 - 访问时间不随使用情况而变化,修改数组时甚至没有任何快捷方式,你总是要复制所有的项目。这也意味着只需要使用AddRange
添加多个项目 - 性能差异将是巨大的。 Add
是使用Insert
在内部实施的,所以目前它是相同的。换句话说,所有更改操作都是o / O(n),而read是o / O(1)。
总而言之,ImmutableList
更关注频繁更改和牺牲读取性能,而ImmutableArray
主要用于大量读取,并且相对较少的更改。