繁体   English   中英

与字典相比,SortedDictionary的预期性能差

[英]Unexpected poor performance of SortedDictionary compared with Dictionary

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

以下是测试的以下方案。

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

有人知道为什么性能会有所不同吗?

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

示例代码:只需切换出带有SortedDictionary的Dictionary即可测试差异。

    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();
        }

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

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

字符串键之间的差异会更大,因为字符串键的比较成本很高。
Dictionary只会对字符串进行两次迭代(如果存在哈希冲突,则将迭代更多)-一次计算哈希码,一次确保其完全匹配。 SortedDictionary将为每次比较迭代该字符串。

我认为这并不罕见。 其他人也得到了相同的结果

我认为这很简单,为什么一个人会比另一个人慢。 SortedDictionary正在做更多的事情。 正在排序。 字典不是,所以更快。

关于应该执行和不应该执行的唯一真实测试是您在上面执行的测试。 我认为您在这里没有做错任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM