Cri*_*lho 1 c# concurrency dictionary
我想知道,C# ConcurrentDictionary 是否支持多个同时写入?还是所有写入都序列化?我知道它是为阅读而优化的,但写作呢?我可以期待多个线程不断写入字典的良好性能吗?
与普通字典一样,写入被“分桶”到组中,然后将这些桶分组到锁定组中。锁定组的数量被称为字典的“并发级别”。默认情况下,并发级别等于 的结果的 4 倍Environment.ProcessorCount,但是您可以使用其多个 构造函数覆盖它。
为了确定两个写入是否会命中同一个锁,它使用私有方法GetBucketAndLockNo来确定要使用哪个哈希桶和哪个锁。
//Code generated via ILSpy from .NET 4.0
private void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount)
{
bucketNo = (hashcode & 0x7FFFFFFF) % bucketCount;
lockNo = bucketNo % lockCount;
}
Run Code Online (Sandbox Code Playgroud)
所以要回答你最初的问题“我可以期待多个线程不断写入字典的良好性能吗?” 答案实际上取决于散列的分布情况,以及您是否会不断插入落入同一个锁分组的记录。如果不使用真实世界的数据对其进行测试并查看其性能是否足够,则无法找出答案。
另请注意,在那里对 .NET 4.5 中的ConcurrentDictionary进行了性能改进,因此如果您使用 .NET 4.0 与 4.5 可能会改变您的结果。例如,如果您没有在构造函数中指定要使用的锁的数量,它将随着字典的增长动态添加更多锁。
| 归档时间: |
|
| 查看次数: |
693 次 |
| 最近记录: |