我有一个IDictionary<TKey,TValue>
内部保存 n other 的实现,Dictionary<TKey, TValue>
并通过键的 HashCode 将插入分发到各个子字典。有 16 个子字典,在 4 核机器上的冲突数量非常低。
对于并行插入,我用 a 锁定了 Add-method ReaderWriterLockSlim
,只锁定了单个子字典:
public void Add(TKey key, TValue value)
{
int poolIndex = GetPoolIndex(key);
this.locks[poolIndex].EnterWriteLock();
try
{
this.pools[poolIndex].Add(key, value);
}
finally
{
this.locks[poolIndex].ExitWriteLock();
}
}
当插入具有四个线程的项目时,我只有大约 32% 的 cpu 使用率和糟糕的性能。所以我用监视器(即lock
关键字)替换了 ReaderWriterLockSlim。CPU 使用率现在接近 100%,性能提高了一倍以上。
我的问题是:为什么 CPU 使用率会增加?碰撞次数不应改变。是什么让 ReaderWriterLock.EnterWriteLock 等了这么多次?