性能:SortedDictionary与SortedSet

时间:2014-02-02 04:22:35

标签: .net performance red-black-tree sortedset sorteddictionary

我应该保持 1.)一个SortedDictionary(double,struct)
2.)或只是一个普通的词典(double,struct)加一个SortedSet(double)?

我只想快速插入。我不关心检索,因为我不会做很多查找。我需要排序自然因为,我所做的唯一查找将是最大双倍或几个最大双倍。

我觉得时间表现明智 - 两者都相同,SortedSet<double>只做额外的工作。你能证实吗?

我不知道的部分是维持排序,SortedDictionary只移动键(双打),还是键和值。在后一种情况下2.)将胜过1.),不是吗?

此外,还不清楚SortedDictionary如何在内部实施。 Sortedset是红黑树,是经过验证的表演者。

1 个答案:

答案 0 :(得分:11)

SortedDictionary<K, V>是要走的路。不仅因为它是适合您使用的结构,而且即使在性能方面和维护方面也会更好。


  

我只想快速插入

  1. 在第二种情况下,您必须同时插入Dictionary<K, V>SortedSet<K>。这是两个插入(一个O(1)和另一个O(log n))。我希望它比单SortedDictionary<K, V>(O(log n))更慢。

  2. SortedDictionary<K, V>在内部实施为SortedSet<KeyValuePair<K, V>>,并在Key的{​​{1}}部分进行了比较。因此,如果您对KeyValuePair<K, V>的表现感到满意,那就不应该回头了。

  3.   

    sorteddictionary只移动键(双打),或键和值

    这显然是微观优化。这只是移动几个额外字节的问题,这几乎无关紧要。

      

    不清楚sorteddictionary是如何在内部实现的。 Sortedset是红黑树,是经过验证的表演者。

    SortedSet<T>在内部实施为SortedDictionary<K, V>,并在SortedSet<KeyValuePair<K, V>>的{​​{1}}部分进行比较。 It is a red-black tree。所以这也是行之有效的......


    另请注意,Key内存会更轻,并且会导致更快的删除和枚举。 KeyValuePair<K, V> / SortedDictionary<K, V>混合方法可以为您提供更快的查找速度,但是在枚举期间,它必须对字典中的每个键进行相应的值部分查找。这会慢一点。


    警告:我在编写上述内容时没有阅读您的评论!!

      

    我正在使用的结构有点重〜100字节

    如果您可以将其更改为课程,请执行此操作。如果您的应用程序是性能关键的,那么移动大约100个字节将不会很好

    我做了一个快速而肮脏的Dictionary<K, V> / SortedSet<K>混合结构并对其进行了测试。

    • 实际上,当插入时,100字节结构更快(速度超过两倍)。肯定会有一个惩罚(谁会创建一个100字节的结构?)。

    • 当我将其更改为类时,它们都具有相同的插入性能。

    • 当我缩小结构的大小时,即使这样,插入性能也是可比的。

    所以我的建议是切换到一个班级并使用Dictionary<K, V>。如果你坚持使用结构,那么SortedSet<K> / SortedDictionary<K, V>会更好。好q,和+1。