我有一个IDictionary<TKey,TValue>
实现,该实现内部保留了其他Dictionary<TKey, TValue>
,并通过键的HashCode将插入的内容分发给单个子词典。在16个子字典的情况下,四核计算机上的冲突数量非常低。
对于并行插入,我使用ReaderWriterLockSlim
锁定了Add-method,仅锁定了单个子词典:
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使用率和较差的性能。因此,我用Monitor(即
lock
关键字)替换了ReaderWriterLockSlim。现在,CPU使用率接近100%,性能提高了一倍以上。
我的问题是:为什么CPU使用率增加了?碰撞次数不应更改。是什么使ReaderWriterLock.EnterWriteLock等待如此多次?
最佳答案
对于仅写负载,Monitor比ReaderWriterLockSlim便宜,但是,如果您在读取远大于写的情况下模拟读+写负载,则ReaderWriterLockSlim应该胜过Monitor。