我有一个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。

10-05 22:02