我想在多线程环境中测量并发字典与字典+锁的性能。所以我创建了自己的 SyncDict 类型类<int,int[]>
。每当有键匹配时,它就会将int[]
数组值添加到自身中,并在更新值时使用 ReaderWriterLockSlim 锁定整个字典。
我通过并发字典复制了代码,我主要使用AddOrUpdate()
方法。
整个控制台应用程序代码可以在这里找到https://dotnetfiddle.net/1kFbGy只需将代码复制粘贴到控制台应用程序中即可运行。它不会运行小提琴
使用相同的输入运行两个代码后,我发现运行时间有相当大的差异。例如,对于我的机器上的一次特定运行,并发字典花费了 4.5 秒,而 SyncDict 花费了不到 1 秒。
我想知道解释上述运行时间的任何想法/建议。我在这里做错了什么吗?
class SyncDict<TKey>
{
private ReaderWriterLockSlim cacheLock;
private Dictionary<TKey, int[]> dictionary;
public SyncDict()
{
cacheLock = new ReaderWriterLockSlim();
dictionary = new Dictionary<TKey, int[]>();
}
public Dictionary<TKey, int[]> Dictionary
{
get { return dictionary; }
}
public int[] Read(TKey key)
{
cacheLock.EnterReadLock();
try
{
return dictionary[key];
}
finally
{
cacheLock.ExitReadLock();
}
}
public void Add(TKey key, int[] value)
{
cacheLock.EnterWriteLock();
try
{
dictionary.Add(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
}
public AddOrUpdateStatus AddOrUpdate(TKey key, int[] value)
{
cacheLock.EnterUpgradeableReadLock();
try
{
int[] result = null;
if (dictionary.TryGetValue(key, out result))
{
if (result == value)
return AddOrUpdateStatus.Unchanged;
else
{
cacheLock.EnterWriteLock();
try
{
Parallel.For(0, value.Length,
(i, state) =>
{
result[i] = result[i] + value[i];
});
繁星点点滴滴
相关分类