天天看點

關于最優化讀寫,測試各個加鎖:Lock、安全字典、信号量、ReaderWriterLock、ReaderWriterLockSlim

大家對于自身項目中都有本地緩存的邏輯,但這塊的讀寫何種機制下哪個快,哪個慢,需要測試對比,以下測試報告,期望給大家一個借鑒,如果有更好的測試結果也歡迎大家一起讨論。

以下測試是開啟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();
            }
        }      

繼續閱讀