Mat*_*ing 11 .net c# collections concurrency
我只是在查看ConcurrentDictionary的MSDN文档,我在"示例"代码中看到了这一点:
// We know how many items we want to insert into the ConcurrentDictionary.
// So set the initial capacity to some prime number above that, to ensure that
// the ConcurrentDictionary does not need to be resized while initializing it.
int NUMITEMS = 64;
int initialCapacity = 101;
Run Code Online (Sandbox Code Playgroud)
作为参考,MSDN示例中的字典初始化如下:
ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>(Environment.ProcessorCount * 2, initialCapacity);
for (int i = 0; i < NUMITEMS; i++) cd[i] = i * i;
Run Code Online (Sandbox Code Playgroud)
在该示例中,字典永远不会包含超过64个项目.为什么不将初始容量设置为64,而不是设置为大于64的看似随意的素数?评论说这是为了确保字典在初始化时不需要调整大小,但为什么需要调整initialCapacity = 64的类似字典?为什么选择这个素数?
Vin*_*ayC 11
字典或散列表依赖于散列键来获取较小的索引以查找相应的存储(数组).因此,哈希函数的选择非常重要.典型的选择是获取密钥的哈希码(以便我们获得良好的随机分布),然后将代码除以素数,并使用提醒来索引固定数量的桶.这允许将任意大的哈希代码转换为有界的小数字集合,我们可以为其定义要查找的数组.因此,在素数中使用数组大小,然后对于大小的最佳选择,重要的是成为大于所需容量的素数.这正是字典实现的确如此.
因此,基本上任何Modulo N(n为素数)字典实现都需要其容量为素数.因此,如果您说,所需的容量是X,那么这些实施通常会选择下一个比所需容量更大的引物数.
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |