使用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需要那么更长的时间来添加更大的对象呢?
我认为人们需要更仔细地阅读问题,而不是急于发布答案。如果你仔细看一下他的示例代码(两个测试),你会发现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