【问题标题】:Should one prefer ImmutableDictionary, or ImmutableSortedDictionary?应该更喜欢 ImmutableDictionary 还是 ImmutableSortedDictionary?
【发布时间】:2015-06-13 21:23:16
【问题描述】:

我听说 .NET System.Collections.Immutable 集合被实现为平衡二叉树,以满足它们的不变性约束,即使是传统上建模像 Dictionary 这样的哈希表的集合,通过使用 GetHashCode 的整数值作为排序键。

如果我有一种生成哈希码便宜且比较便宜的类型(例如stringint),我不关心我的排序性集合,更喜欢ImmutableSortedDictionary 是否有意义,因为底层数据结构无论如何都是排序的?

【问题讨论】:

  • 如果我有一个生成哈希码很便宜的类型,并且比较便宜(例如字符串或整数),我不关心排序的-ness of my collection. 我想你已经回答了自己。把事情简单化。从另一个程序员的角度来看,我会很困惑地阅读代码并发现排序字典的排序是无用的,这让我想知道为什么首先要使用它。
  • @YuvalItzchakov: ImmutableDictionaryImmutableSortedDictionary(它们都是 AVL 树)
  • 那为什么重要呢?如果排序不是问题,为什么不使用ImmutableDictionary
  • @Yuval:因为ImmutableDictionary 排序的。它只是按GetHashCode 的数值排序,而不是按键类型提供的内在排序。
  • @Yuval:这不是一个实现细节,正如 Dictionary 是一个哈希表是一个实现细节。其价值在于,在典型用例中,按 T 排序的版本可能比按 GetHashCode 排序的版本更快,就像 Dictionary 通常比 SortedDictionary 更快一样。

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


【解决方案1】:

答案是是的,在某些情况下首选ImmutableSortedDictionary 是有意义的,例如使用Int32 键。

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

我使用 100 万个项目运行了一个小型基准测试:

  • 按 key 升序插入 1,000,000 个项目
  • 更新 1,000,000 个随机项目
  • 扫描 1,000,000 个项目,即对集合中的每个项目进行一次迭代
  • 读取 1,000,000 个随机项
  • 删除 1,000,000 个随机项目

ImmutableDictionary

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

ImmutableSortedDictionary

Insert: 1808 ms
Update: 4928 ms
Scan:    246 ms
Read:    732 ms
Delete: 3522 ms

ImmutableSortedDictionary 在所有操作上都比ImmutableDictionary 快一点。请注意,插入是按键的升序一次完成的(因为它恰好与我的特定用例匹配)。

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

【讨论】:

    【解决方案2】:

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

    1. 它可以使用专门针对 int 键的更高效的搜索树,例如哈希树或帕特里夏树。

    2. 它的内部循环将几乎完全进行int 比较,而不是一般比较。

    但是,如果您需要更好的性能,通常最好切换到像 HashSet 这样的可变集合。

    【讨论】:

      【解决方案3】:

      这应该不重要。 this blog post 的时间复杂度表明,虽然你确实从 Dictionary.Add 获得了比 SortedDictionary.Add 更好的性能(O(1) vs O(log n)ImmutableDictionaryImmutableSortedDictionary 的时间复杂度都是 O(log n)

      【讨论】:

      • 1.好吧,我对实际行为更感兴趣;例如,ImmutableArray 的迭代速度比 ImmutableList 快得多;但具有相同的复杂性。 2. 当然,如果GetHashCode 值相同,ImmutableDictionary 会退回到线性行为...
      • @BillyONeal 文章没有说清楚的一件事是ImmuteableSortedDictionary的最坏情况我不确定是O(n log n)还是O(n)
      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多