从字典复制对象的引用或直接从字典访问它是否更快?

Pet*_*etr 7 c# performance dictionary

问题很简单

是这段代码

public Dictionary<string, SomeObject> values = new Dictionary<string, SomeObject>();

void Function()
{
    values["foo"].a = "bar a";
    values["foo"].b = "bar b";
    values["foo"].c = "bar c";
    values["foo"].d = "bar d";
}
Run Code Online (Sandbox Code Playgroud)

和这段代码一样快

public Dictionary<string, SomeObject> values = new Dictionary<string, SomeObject>();

void Function()
{
    var someObject = values["foo"];
    someObject.a = "bar a";
    someObject.b = "bar b";
    someObject.c = "bar c";
    someObject.d = "bar d";
}
Run Code Online (Sandbox Code Playgroud)

常识告诉我,在字典中查找引用一次并将其存储在某处应该更快,这样就不需要多次查找,但我真的不知道字典是如何工作的.

那么它更快还是没有?为什么?

Joe*_*nos 7

是的,你是对的.您的第一种方法是进行4次字典查找,而第二次进行一次.第二个肯定更好.

然而,在现实生活中,字典查找的速度非常快,所以除非你有一本庞大的字典,否则差异不会很明显,甚至可能无法衡量.


Ale*_*kov 6

乔是完全正确的,但似乎还不够,我做了一个简单明显的测试:

static void Main(string[] args)
{
    var dict = new Dictionary<string, Foo>();
    var number = 10000000;
    for (int i = 0; i < number; i++)
    {
        dict[i.ToString()] = new Foo();
    }

    var watch = new Stopwatch();

    watch.Start();
    for (int i = 0; i < number; i++)
    {
        var key = i.ToString();
        dict[key].A = "a";
        dict[key].B = "b";
        dict[key].C = "c";
        dict[key].D = "d";
    }

    watch.Stop();
    Console.Out.WriteLine(watch.ElapsedMilliseconds);

    watch.Reset();

    watch.Start();
    for (int i = 0; i < number; i++)
    {
        var key = i.ToString();
        var foo = dict[key];

        foo.A = "a";
        foo.B = "b";
        foo.C = "c";
        foo.D = "d";
    }

    watch.Stop();
    Console.Out.WriteLine(watch.ElapsedMilliseconds);
}   

class Foo
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这输出到:

3423
2113
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

只有1次查找肯定会减少大数字的总时间.