大家對于自身項目中都有本地緩存的邏輯,但這塊的讀寫何種機制下哪個快,哪個慢,需要測試對比,以下測試報告,期望給大家一個借鑒,如果有更好的測試結果也歡迎大家一起讨論。
以下測試是開啟10個并發任務對同一個字典進行10萬次插入,就相當于100萬次插入動作
TestLock //測試lock
Time Elapsed: 1,342ms
CPU Cycles: 56,099,316
Gen 0: 67
Gen 1: 1
Gen 2: 0
TestSalfDictionary //測試線程安全字典
Time Elapsed: 259ms
CPU Cycles: 268,257
Gen 0: 67
Gen 1: 0
Gen 2: 0
TestSemaphore //測試信号量
Time Elapsed: 588ms
CPU Cycles: 285,531
Gen 0: 67
Gen 1: 0
Gen 2: 0
TestReaderWriterLock //測試ReaderWriterLock
Time Elapsed: 4,576ms
CPU Cycles: 241,155
Gen 0: 67
Gen 1: 0
Gen 2: 0
TestReaderWriterLockSlim //測試ReaderWriterLockSlim
Time Elapsed: 864ms
CPU Cycles: 288,810
Gen 0: 67
Gen 1: 0
Gen 2: 0
目前看下來安全字典的測試性能貌似最好的,ReaderWriteLock 效率最低,還不如lock,大家在今後項目中使用自己衡量一下!
關于信号量的測試代碼,我貼一下,如覺得有更合理的運用它,歡迎來多多交流!
static readonly Semaphore _semaphore = new Semaphore(10, 10);
static readonly IDictionary<int, int> _dictionaryForSemaphore = new Dictionary<int, int>();
static void TestSemaphore()
{
for (int i = 0; i < _number; i++)
{
_semaphore.WaitOne(100);
Random random = new Random(int.MaxValue);
var key = random.Next(int.MaxValue);
if (!_dictionaryForSemaphore.ContainsKey(key))
_dictionaryForSemaphore.Add(key, i);
_semaphore.Release();
}
}