与Dictionary相比,SortedDictionary的性能出乎意料

时间:2010-03-04 02:12:13

标签: c# .net generics

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

以下是测试的以下方案。

  1. 使用[key] accessor
  2. 按顺序更新每个值
  3. 使用[key] accessor
  4. 对每个值进行顺序访问
  5. 使用TryGetValue
  6. 按顺序访问每个值
  7. 使用[key] accessor
  8. 随机访问每个值
  9. 使用TryGetValue
  10. 随机访问每个值

    任何人都知道性能差异的原因吗?

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

    示例代码:只需使用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();
            }
    

2 个答案:

答案 0 :(得分:18)

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

因此,Dictionary可以更快地进行查找。

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

答案 1 :(得分:1)

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

我认为为什么一个人会慢于另一个人,这很简单。 SortedDictionary做得更多。这是排序。字典不是,所以它更快。

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