.Net 4.0出了不少跟多工有關係的新類別,其中ConcurrentDictionary對我來說還挺實用的. 至少不用再寫一堆EnterLock, 程式會好看很多. 但是在實際使用前,有鑑於之前遇到Array.Sort效率低落的經驗, 還是先測試一下基本效率好了
程式很簡單,就只是用迴圈,測寫入跟讀取十萬次
結果大如下,不過請注意這只是單執行序迴圈,這不代表實際多執行序情況運用的效能,只是給大家當個參考
測試環境為Win7, Visual Studio 2010 Beta2, Single Thread
結果如下,時間單位是ms
Dictionary with ReaderWriterLock Writing Time:51.3122
Dictionary with ReaderWriterLock Reading Time:29.9333
Dictionary with ReaderWriterLockSlim Writing Time:29.4264
Dictionary with ReaderWriterLockSlim Reading Time:18.2223
Dictionary Writing Time:31.1934
Dictionary Reading Time:4.9508
Dictionary with try-finally Writing Time:17.6937
Dictionary with try-finally Reading Time:6.068
Dictionary with Mutex Writing Time:210.7196
Dictionary with Mutex Reading Time:209.661
Dictionary with Semaphore Writing Time:243.5548
Dictionary with Semaphore Reading Time:207.5424
Dictionary with SemaphoreSlim Writing Time:63.7131
Dictionary with SemaphoreSlim Reading Time:52.0932
Dictionary with lock Writing Time:21.5253
Dictionary with lock Reading Time:9.7504
ConcurrentDictionary Writing Time:50.1722
ConcurrentDictionary Reading Time:10.9998
ConcurrentDictionary with try-finally Writing Time:60.7422
ConcurrentDictionary with try-finally Reading Time:9.3537
結論:
從頭開始看, ReaderWriterLockSlim的確比ReaderWriterLock快, 此時看一下單純存取Dictionary的效率…見鬼了,寫入部分有使用ReaderWriterLockSlim比什麼都沒做更快. 後來測試一個加了try-finally的版本,的確會比較快…可能跟.Net內部機制有關係吧,管他的.
再來看到老牌的Mutex和Semaphore, 相較之下除了慢到靠背以外我沒有別的評語, 看來以後程式最佳化時要把這兩傢伙開除了. SemaphoreSlim表現倒是還可以.
既然Mutex測了,那Moniter也來一下好了. lock好像是用Monitor實作的, 測試結果是比Mutex好多了.
最後當然是測試主角ConcurrentDictionary, 寫入稍慢, 讀取到還挺快的. 由於剛剛測出Dictionary有曖昧關係, ConcurrentDictionary順便測一下的結果倒是還正常.
隨便測測, 有空還要玩玩Parallelism的東西, 到時在來報告經驗吧



