ConcurrentDictionary上的大数字

时间:2013-12-08 11:26:17

标签: c# concurrentdictionary

我想知道为什么ConcurrentDictionary getOrAdd方法随着条目数的增长而减慢。

我在3个嵌套循环中调用它,打印到每个内嵌循环的时间,我可以看到每个内部循环的执行时间线性增长,我不知道为什么,因为每个内部循环都是相同的大小。我猜这是ConcurrentDictionary的问题,但这就是我在这里问的原因。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是因为碰撞。 ConcurrentDictionary 维护一个存储桶列表, GetHashCode 方法返回的结果确定将在哪个存储桶中放置一个条目。理想情况下,每个条目都应该在单独的桶中。但是,实际上这是不可能的。如果 GetHashCode 为2个不同的密钥返回相同的值,则会出现冲突,并且越来越多的条目放在同一个存储桶中。

在引擎盖下,每个存储桶都实现为链接列表。每当检测到碰撞时,字典必须扫描某些链表以检查给定条目是否已经存在。此字典中的元素越多,链接列表就越长,迭代它们所需的时间就越多。

顺便说一句,标准 Dictionary 以不同的方式实现,但行为方式类似。可以找到两个数据结构内部的良好描述here