【问题标题】:Unexpected poor performance of SortedDictionary compared with Dictionary与 Dictionary 相比,SortedDictionary 的性能出乎意料的差
【发布时间】:2010-03-04 02:12:13
【问题描述】:

我不明白为什么 SortedDictionary 的性能在设置和检索值方面比 Dictionary 慢大约 5 倍。我预计插入和删除会更慢,但不会更新或检索。我已经测试了 .Net 3.5 和 .Net 4.0 版本的编译代码。预先计算了一组随机密钥,以确保随机变化不会导致随机访问的差异。

以下是测试的场景。

  1. 使用 [key] 访问器顺序更新每个值
  2. 使用 [key] 访问器顺序访问每个值
  3. 使用 TryGetValue 顺序访问每个值
  4. 使用 [key] 访问器随机访问每个值
  5. 使用 TryGetValue 随机访问每个值

有人知道为什么会出现性能差异吗?

如果我做错了什么或愚蠢的,请指出。

示例代码:只需使用 SortedDictionary 切换字典即可测试差异。

    const int numLoops = 100;
    const int numProperties = 30;
    const int numInstances = 1000;

    static void DictionaryBench(int numLoops, int numValues, int numInstances, string[] keyArray)
    {
        Stopwatch sw = new Stopwatch();
        double total = 0.0d;

        for (int j = 0; j < numLoops; j++)
        {
            //sw.Start();
            Dictionary<string, object> original = new Dictionary<string, object>(numValues);
            for (int i = 0; i < numValues; i++)
            {
                original.Add(String.Format("Key" + i.ToString()), "Value0:" + i.ToString());
            }
            List<Dictionary<string, object>> collectionList = new List<Dictionary<string, object>>(numInstances);
            for (int i = 0; i < numInstances; i++)
            {
                collectionList.Add(new Dictionary<string, object>(original));
            }
            sw.Start();
            //Set values on each cloned instance to uniqe values using the same keys
            for (int k = 0; k < numInstances; k++)
            {
                for (int i = 0; i < numValues; i++)
                {
                    collectionList[k]["Key" + i.ToString()] = "Value" + k.ToString() + ":" + i.ToString();
                }
            }

            //Access each unique value
            object temp;
            for (int k = 0; k < numInstances; k++)
            {
                for (int i = 0; i < numValues; i++)
                {
                    temp = collectionList[k]["Key" + i.ToString()];
                }
            }
            //Random access
            //sw.Start();
            for (int k = 0; k < numInstances; k++)
            {
                for (int i = 0; i < numValues; i++)
                {
                    collectionList[k].TryGetValue(keyArray[i],out temp);
                }
            }
            sw.Stop();
            total += sw.ElapsedMilliseconds;
            sw.Reset();
        }

【问题讨论】:

    标签: c# .net generics


    【解决方案1】:

    SortedDictionary 使用二进制搜索查找,即 O(log n)。
    Dictionary 使用哈希表,即 O(1)。

    因此,Dictionary 提供了更快的查找速度。

    字符串键的差异会更大,比较昂贵。
    Dictionary 只会迭代字符串两次(如果存在哈希冲突,则迭代更多次) - 一次用于计算哈希码,一次用于确保它完全匹配。 SortedDictionary 将迭代字符串以进行 every 比较。

    【讨论】:

      【解决方案2】:

      我不认为这很不寻常。 Others have gotten the same results.

      我认为为什么一个比另一个慢的原因很简单。 SortedDictionary 做得更多。是分拣。字典不是,所以它更快。

      关于什么应该和不应该是高性能的唯一真正测试是您在上面执行的测试。我不认为你在这里做错了什么。

      【讨论】:

      • 我希望在包含超过 1,000,000 个对象的数据集上比较 B-Tree-Sorted-Dictionary 和 SortedDictionary 的性能,希望能够加快查找内存数据集匹配对象的访问性能。这可能会很有趣。
      猜你喜欢
      • 2019-03-25
      • 2020-03-10
      • 2011-07-22
      • 2019-11-24
      • 2019-09-22
      • 2018-11-17
      • 1970-01-01
      • 2014-03-24
      • 2023-03-25
      相关资源
      最近更新 更多