使用Dictionary<>产生奇怪的性能结果

本文关键字:性能 结果 Dictionary 使用 | 更新日期: 2023-09-27 18:06:43

似乎Dictionary<,>性能受到存储项大小的影响(这看起来很奇怪)。

这是我的简单类:

public class MyObject
{
    public Guid Key { get; set; }
}

和两个简单的测试:

private long _Iterations = 1000000;
[TestMethod]
public void ShouldTestDefaultConstructorPerformance()
{
    for (var i = 0; i < _Iterations; i++)
    {
        var obj = new MyObject() { Key = Guid.NewGuid() };
    }
}
[TestMethod]
public void ShouldTestDefaultGuidDictionaryPerformance()
{
    var dict = new Dictionary<Guid, MyObject>();
    for (var i = 0; i < _Iterations; i++)
    {
        var obj = new MyObject() { Key = Guid.NewGuid() };
        dict.Add(obj.Key, obj);
    }
}

最初我得到以下计时:

ShouldTestDefaultConstructorPerformance    : 00:00:00.580
ShouldTestDefaultGuidDictionaryPerformance : 00:00:01.238

现在,我将改变MyObject类:

public class MyObject
{
    public Guid Key { get; set; }
    private Dictionary<string, string> _Property0 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property1 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property2 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property3 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property4 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property5 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property6 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property7 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property8 = new Dictionary<string, string>();
    private Dictionary<string, string> _Property9 = new Dictionary<string, string>();
}

并再次运行测试:

ShouldTestDefaultConstructorPerformance    : 00:00:01.333
ShouldTestDefaultGuidDictionaryPerformance : 00:00:07.556

在第二个测试中,对象构造花费了1.72倍的时间,但是添加到Dictionary中花费了6.11倍的时间。我预计测试需要更长的时间,但是为什么Dictionary需要那么更长的时间来添加更大的对象呢?

使用Dictionary<>产生奇怪的性能结果

我认为人们需要更仔细地阅读问题,而不是急于发布答案。如果你仔细看一下他的示例代码(两个测试),你会发现MyObject带有Guid和MyObject带有Guid和10dict的循环之间的差别在1秒之内(对象构造)。然而,add dictionary至少需要5秒的时间。

我想我的答案是:使用分析器并找出哪位实际上占用了更长的时间

这可能会突出显示实例化。也许:)

我认为var obj = new MyObject() { Key = Guid.NewGuid() };这一行实际上需要更长的时间,而不是Add()的字典。您是否在方法中测量 ?

添加到字典中的每个对象都被赋予一个特殊的唯一标识符,以加快其在内存中的搜索和检索速度。这个特殊的唯一标识符(称为哈希)是通过分析对象的整个内容来计算的。对象越大,计算哈希值的速度就越慢。

如果您对其工作原理的细节感兴趣,请查看大学课程中的这个示例:http://www.ccs.neu.edu/home/sbratus/com1101/hash-dict.html