關於最優化讀寫,測試各個加鎖: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,你們在從此項目中使用本身衡量一下!併發

關於信號量的測試代碼,我貼一下,如以爲有更合理的運用它,歡迎來多多交流!dom

        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();
            }
        }
相關文章
相關標籤/搜索