我已经测试了使用(int,int,string)元组作为键和使用嵌套字典Dictionary>>作为键来检索、更新和删除值的速度。
我的测试结果显示,元组字典要慢得多(检索58%,更新69%,删除200%)。我没有预料到这一点。嵌套字典需要进行更多的查找,那么为什么元组字典会慢那么多呢?
我的测试代码:
我的测试结果显示,元组字典要慢得多(检索58%,更新69%,删除200%)。我没有预料到这一点。嵌套字典需要进行更多的查找,那么为什么元组字典会慢那么多呢?
我的测试代码:
public static object TupleDic_RemoveValue(object[] param)
{
var dic = param[0] as Dictionary<(int did, int eid, string name), string>;
var keysToRetrieve = param[2] as List<(int did, int eid, string name)>;
foreach (var key in keysToRetrieve)
{
dic.Remove(key);
}
return dic;
}
public static object NestedDic_RemoveValue(object[] param)
{
var dic = param[1] as Dictionary<int, Dictionary<int, Dictionary<string, string>>>;
var keysToRetrieve = param[2] as List<(int did, int eid, string name)>;
foreach (var key in keysToRetrieve)
{
if (dic.TryGetValue(key.did, out var elementMap) && elementMap.TryGetValue(key.eid, out var propertyMap))
propertyMap.Remove(key.name);
}
return dic;
}
测试额外信息: 该字典包含总共10,000条条目。键是递增的:([0-100],[0-100],“Property [0-100]”)。 在单个测试中,检索了100个键(其中10%不在字典中),更新了100个值(其中10%是新的)或删除了100个键(其中10%开始时不在字典中)。检索、更新和删除分别进行了3次测试。每次测试执行1000次。我比较了平均执行时间和中位数执行时间。
HashCode()
是如何计算的 - 它的成本比计算3个单独的int
,int
,string
的HashCodes()
更高吗?您使用了什么样本大小进行测量,用什么时间来计时?也许将所示代码扩大到一个真正的最小完整可验证示例。有3个字典可以更快地将数据切割成更小的分区进行搜索,而不是只有一个巨大的字典 - 因此后者在设计上可能更快。最好将元组与非匿名类进行比较,这比您所做的更公平。 - Patrick Artner