为什么List <string>比Dictionary更快?</string>

时间:2015-01-21 16:44:59

标签: c# performance list dictionary

考虑以下代码:

var str1 = "1234567890qwertyuiop[asdfghjkl;zxcvbnm1,.";

Dictionary<string, Object> objects = new Dictionary<string, object> {{str1, new object()}};

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

for (int i = 0; i < 100000000; i++)
{
    object result;
    objects.TryGetValue(str1, out result);
}

stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

stopwatch.Reset();
//////////////////////////////////////////////////////////////
var list = new List<string>();
list.Add(str1);

stopwatch.Start();

for (int i = 0; i < 100000000; i++)
{
    foreach (var item in list)
    {
        var result = "";

        if (item == str1)
        {
            result = item;
        }
    }
}

stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

运行此代码时,会看到以下结果:

5157      // Dictionary
3881      // List

因此列表比字典快。

我想知道原因。字符串和长度之间是否有任何关系?

1 个答案:

答案 0 :(得分:14)

因为你只有一个元素,所以你的列表代码只是跳过一个哈希检查而没有额外的工作 因为你有这么长的密钥,字典正在做更多的工作来计算密钥的散列,而列表实现会跳过所有这些,因为字符串是引用相等的(它不需要比较所有内容。)

添加更多项目,性能将发生巨大变化。

简而言之,如果n为1,则O(1)不比O(n)快。