我做了一些测试:SortedDictionary,SortedList和Dictionary(只是为了比较)。结果是,在添加,删除和返回基于键的值(100,000对键+每个字典中的值)时,Dictionary比其他两个快得多。
有人能告诉我为什么SortedList和SortedDictionary比Dictionary慢?
答案 0 :(得分:2)
根据未排序的列表,以排序列表为例。
让我们假设在任意索引处的未排序列表上的插入时间是O(n / 2),其中n是列表的大小。反映出,平均而言,必须移动一半的列表元素,以便为插入的元素腾出空间。
类似地,在此列表中,从任意位置移除元素也是O(n / 2),因为平均而言,必须移动一半元素以缩小间隙。
。 。 。
现在,想象一下相同的实现,但是要进行排序。
排序必须在插入时完成 - 它必须找到新元素的位置。由于之前的所有元素都已经排序(我们在插入时这样做,所以这是真的),我们可以从头开始扫描。
这是一个O(n / 2)操作,在我们开始插入之前。那只是为了找到插入点。
一个更好的方法,使用二进制搜索会给我们O(log n)找到插入位置,但仍然需要支付O(n / 2)成本插入本身。
如果扫描操作的成本是s,并且插入操作的成本是m(移动),那么分类插入的成本是:
s x O(log n) + m x (n/2)
但是,在任意位置的未排序列表上的插入操作仅为:
m x (n /2)
这是分类操作需要更长时间的真正原因的具体例子。
这种理论还有很多,但这应该是一个开始。
答案 1 :(得分:0)
因为每次添加或删除值时,这些数据结构都会再次排序 。因此,在使用它们时会受到性能影响。
答案 2 :(得分:0)
字典只是将新条目抛出到列表的末尾。它所要做的就是跟踪列表末尾的位置。但是,SortedDictionary必须找出列表中的右侧位置以放置新条目。显然,这需要一些计算工作,而不是简单地将其添加到最后。
对于删除,两种类型的对象都必须查找要删除的记录,但排序类型需要评估删除该记录对其内部结构的影响。例如,b-tree可能需要在删除后重新平衡分支。再次需要一些计算来评估这一点。因此,性能上的差异。