SortedList不应该比Dictionary慢吗?

时间:2017-06-14 14:37:35

标签: c#

现在我正在接收c#,现在,我正试图找出长列表可能存在的性能问题。因此,当我使用Dictionaries或SortedLists时,我希望得到一些关于速度差异的数据。

这就是我提出这个例子的原因

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Diagnostics;

namespace dictionary_vs_sortedList
{
class Program
{
    static void Main(string[] args)
    {

        long search = 20000;
        SortedList<long, string> myList = new SortedList<long, string>();
        Dictionary<long, string> myDict = new Dictionary<long, string>();
        for (long i = 0; i < 10*search; i++){
            myDict.Add(i, "hi");
            myList.Add(i, "hey");

        }

        var watch1 = Stopwatch.StartNew();



        if (myDict.ContainsKey(search))
        {
            Console.WriteLine("is included");

        }

        watch1.Stop();
        TimeSpan ts1 = watch1.Elapsed;
        Console.WriteLine(ts1);


        var watch2 = Stopwatch.StartNew();

        if (myList.ContainsKey(search))
        {
            Console.WriteLine("is also included");

        }
        watch2.Stop();
        TimeSpan ts2 = watch2.Elapsed;
        Console.WriteLine(ts2);
    }
}
}

这个输出总是让我的字典运行时间比SortedList长。我认为Contains()和O(1)一起用于字典,而O(n)用于SortedList

修改

感谢您的快速帮助。 关于如何通过我不想测量的代码行来破坏我的测量,我没有注意。 这个问题现在可能会被关闭。

2 个答案:

答案 0 :(得分:1)

您不应该只运行一次来​​测试操作的性能。我在每个检查周围放置了一个for循环,并进行了1000次迭代(并移除了Console.Write)并获得了以下结果

Dictionary  00:00:00.0000286
SortedList  00:00:00.0056493

所以结果很明显。

答案 1 :(得分:0)

您的时间测量有几个问题:

  • 首先,在开始测量之前,您必须先执行该部分。原因很简单,在执行代码之前,它必须由JIT编译器编译。这需要时间。您不希望编译时间成为测量的一部分。
  • 其次,O(n)和O(1)操作基于合理平衡的填充。此外,搜索一个元素可能导致与搜索同一集合中的另一个元素不同的度量。我可以说字典可以执行非常慢并且SortedList非常庞大的情况。所以你应该用不同的(随机?)值进行多次搜索(1000?100.000?)。这样做会产生更可靠的结果。
  • 第三,尽可能多地删除测量中的代码。 Console.WriteLine操作相当慢,会对您的测量产生非常不利的影响。

*编辑*

SortedList有一个O(log n)操作,而不是O(n),但除此之外。