应该更喜欢ImmutableDictionary还是ImmutableSortedDictionary?

时间:2015-04-08 18:38:35

标签: c# .net base-class-library immutable-collections

我听说.NET System.Collections.Immutable集合是作为平衡二叉树实现的,以满足它们的不变性约束,甚至是传统上对Dictionary这样的散列表进行建模的集合,通过使用积分值GetHashCode作为排序密钥。

如果我有一个生成哈希码便宜的类型,并且比较便宜(例如stringint),我也不在乎我的集合的排序,是否有意义更喜欢ImmutableSortedDictionary,因为底层数据结构仍然是排序的?

4 个答案:

答案 0 :(得分:5)

答案是,在某些情况下更喜欢ImmutableSortedDictionary,例如使用Int32密钥。

就我而言,使用Int32键我发现ImmutableSortedDictionary是更好的选择。

我使用了100万件物品运行了一个小基准:

  • 按键
  • 的升序插入1,000,000个项目
  • 更新1,000,000个随机商品
  • 扫描1,000,000个项目,即在集合中的每个项目上迭代一次
  • 阅读1,000,000个随机项目
  • 删除1,000,000个随机商品

ImmutableDictionary< int,object>

Insert: 2499 ms
Update: 7275 ms
Scan:    385 ms
Read:    881 ms
Delete: 5037 ms

ImmutableSortedDictionary< int,object>

Insert: 1808 ms
Update: 4928 ms
Scan:    246 ms
Read:    732 ms
Delete: 3522 ms
在所有操作中,

ImmutableSortedDictionaryImmutableDictionary快一点。请注意,插入按键的升序一次一个项完成(因为它恰好符合我的特定用例)。

但是,您还应该考虑使用带有锁定功能的可变集合。写入可变Dictionary<int, object>的速度要快一个数量级。

答案 1 :(得分:1)

基于哈希的集合在.NET上应该明显更快,因为:

  1. 它可以使用专用于int密钥的更有效的搜索树,例如哈希特里树或帕特里夏树。

  2. 它的内部循环几乎完全int比较,而不是通用的比较。

  3. 但是,如果您需要更好的性能,那么切换到像HashSet这样的可变集合通常会好得多。

答案 2 :(得分:-1)

这应该不重要。来自this blog post的时间复杂性表明,Dictionary.AddSortedDictionary.Add O(1)O(log n) ImmutableDictionary ImmutableSortedDictionaryO(log n) { {1}}的时间复杂度为{{1}}

答案 3 :(得分:-2)

在我看来,对这类问题的正确回答通常是&#34;谁在乎&#34;?

除非你有一些非常具体的,非常不寻常的情况,否则对这个问题的迷恋可能是浪费时间,因为你在处理时间方面担心十亿分之一秒,而且记忆的差异可以忽略不计。