C#Hashtable與Dictionary比較性能


Hashtable 和 Dictionary  在使用場景上必然存在選擇性, 並不任何時刻都能相互替代.
[1] 單線程程序中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
[2] 多線程程序中推薦使用 Hashtable, 默認的 Hashtable 允許單線程寫入, 多線程讀取, 對 Hashtable 進一步調用 Synchronized() 方法可以獲得完全線程安全的類型. 而 Dictionary 非線程安全, 必須人為使用 lock 語句進行保護, 效率大減.
[3] Dictionary 有按插入順序排列數據的特性 (注: 但當調用 Remove() 刪除過節點后順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.

幾種C#框架提供的數據結構對單值查找的效率比較->http://www.cnblogs.com/eaglet/archive/2008/10/23/1317893.html
我個人是覺得,無論什么時候,都應該使用Dictionary<K,V>,理由如下:
1、Dic是類型安全的,這有助於我們寫出更健壯更具可讀性的代碼,而且省卻我們強制轉化的麻煩。這個相信大家都明白。
2、Dic是泛行的,當K或V是值類型時,其速度遠遠超過Hashtable。這個大家對值類型與引用類型有所了解的話也會明白。
3、如果K和V都是引用類型,如eaglet所測,Hashtable比Dic更快,這里我要指出,eaglet所做的測試是有問題的。原因在於Hashtable與Dic采用的是不同的數據結構。eaglet的“Dictionary 由於在Hashtable基礎上封裝了一層”這個說法是不對的。

Dictionary 調用 Add 方法之前使用 ContainsKey 方法測試某個鍵是否存在,否則得到一個KeyNotFoundException。
當程序頻繁嘗試字典中不存在的鍵時,使用 TryGetValue 方法來檢索值,這種方法是一種更有效的檢索值的方法。

具體我也不講了,因為有人(Angel Lucifer)已經講得很清楚了,引用如下:

http://www.cnblogs.com/lucifer1982/archive/2008/06/18/1224319.html
http://www.cnblogs.com/lucifer1982/archive/2008/07/03/1234431.html

Hashtable在指定capacity參數時,它並不只開出capacity個槽的內存空間,而是開出比 capacity / 0.72(默認裝填因子) 大的最小素數個槽的空間;而Dic在指定capacity時,是開出 比capacity 大的最小素數個槽的空間。因此可以看到,樓主雖然都指定capacity為10萬,而實際上Hashtable的槽的總數遠遠大於Dic的槽的總數,也就是占用的內存遠遠大於Dic,因此,如此測試是不公平不公正的,如要公平公正的測試,則應該把Dic的capacity指定為 10萬/0.72,請大家再測試其性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM