1. 程式人生 > >C#Hashtable與Dictionary效能

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)已經講得很清楚了,引用如下:

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

相關推薦

C#HashtableDictionary效能

 由於 Hashtable 和 Dictionary 同時存在, 在使用場景上必然存在選擇性, 並不任何時刻都能相互替代. [1] 單執行緒程式中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分. [2] 多執行緒程式中推薦使用 Hash

C# HashTableDictionary的區別

字符串 同時 找到 lis mov ble logs 去除 lba HashTable和Dictionary的區別   1.HashTable   哈希表(HashTable)表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Coll

C# Hashtable vs Dictionary 學習筆記

new 拆箱 打印 筆記 兩個 args for com 比較   Hashtable 和 Dictionary 存儲的都是鍵值對,我的理解是Dictionary是Hashtable的泛型實現。 Hashtable的鍵和值都是object類型。所以,key和v

C# HashTableDictionary

stat spa 可用 each before exception ash 運行 msdn 1.HashTable 哈希表(HashTable)表示鍵/值對的集合。 其中key通常可用來快速查找(key區分大小寫),value用於存儲對應於key的值。 默認的 Hasht

HashTableDictionary比較

       看了好多這兩個類的總結,不同的人理解有些偏差,總結如下:        首先,兩者都用來儲存鍵值對。對於二者的區別,最明顯的就是Dictionary針對的是泛型,而HashTable是非泛型,鍵值對均為object型別,類似於list與arraylist的關

C#下HashtableDictionary之間的差別

Hashtable和Dictionary都是.Net下的表示鍵值對的集合,那麼我們在使用中該選擇Hashtable還是Dictionary?下邊我們看看他們之間的區別:1、Dictionary<K,V>在使用中是順序儲存的,而Hashtable由於使用的是雜湊演算法進行資料儲存,是無序的。2、Di

C#中的HashSet, HashTableDictionary的區別

HashSet和Python中的Set差不多,都是為邏輯運算準備的,HashSet不允許資料有重複,且存入的時單值不是鍵值對。 HashTable和Dictionary差不多,但是他們的實現方式時不同的,Dictionary俗稱字典,裡面存放的時鍵值對,即Ke

[C#基礎教程]C# 泛型Dictionary 之一(Hashtable)使用說明

using System; using System.Collections.Generic; public class Example {     public static void Main()     {         //建立泛型雜湊表,然後加入元素         Dictionary<s

C# 的HashtableDictionary比較

我個人是覺得,無論什麼時候,都應該使用Dictionary<K,V>,理由如下:      1、Dic是型別安全的,這有助於我們寫出更健壯更具可讀性的程式碼,而且省卻我們強制轉化的麻煩。這個相信大家都明白。      2、Dic是泛型的,當K或V是值型別時,其速度遠遠超過Hashtable。這個大

排序演算法的C++實現效能分析(插入排序、歸併排序、快速排序、STOOGE排序、堆排序)

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法 氣泡排序、插入排序、歸併排序和基數排序都是穩定的排序演算法。 總結: (1)如果資料量非常小,那麼適合用簡單的排序演算法:氣泡排序,選擇排序和插入排序。因為他們雖然比較次數多,但是移動次數少。比如,如果記錄的關鍵

學習筆記(一)C#基礎和泛型List和DataTable和HashTableDictionary的簡單用法--存值 取值

<pre name="code" class="csharp">//Dictionary Dictionary<string, string> dic = new Dictio

C# refout關鍵字解析

參數 logs linq using 如果 .cn cat oid 技術分享 簡介:ref和out是C#開發中經常使用的關鍵字,所以作為一個.NET開發,必須知道如何使用這兩個關鍵字. 1、相同點 ref和out都是按地址傳遞,使用後都將改變原來參數的數值。 2、ref

C# Stream byte[]、文件的轉換

stream/* - - - - - - - - - - - - - - - - - - - - - - - - * Stream 和 byte[] 之間的轉換 * - - - - - - - - - - - - - - - - - - - - - - - */ /// <summary> ///

c++--模板泛型編程

編譯 string std size_t har rom 數組大小 傳遞 成員函數 一、定義模板 1.1 函數模板 1. 適用情況:如果兩個函數幾乎是相同的,唯一的差異是參數的類型,函數體則完全一樣。 2. 定義 template <模板參數列表(以逗號分隔)&g

C# Hashtable賦值給另一個Hashtable

元素 全部 nbsp htable table賦值 tab tor 操作 enume c#中想將一個hashtable的元素全部給另一個hashbale時, 使用叠代一個一個元素賦值 如: ammus.Clear(); IDictionaryEnume

c# backgroundworker invoke

src keras dev tool tools lis sla ogre += 1.BackgroundWorker b = new BackgroundWorker(); b.WorkerReportsProgres

C++繼承派生

規則 方法 三種 賦值兼容 順序 spa 構造 指針 rtu 2017-06-25 23:00:59 c++中的繼承和派生是面向對象編程中的一個重要內容,通過繼承可以實現代碼的復用,同時繼承也是實現多態性的基礎。 一、c++繼承的基本形式 class 派生類名:繼承方式 基

C++編譯器鏈接器工作原理

方式 成了 ble pro 需要 symbols ron oid 名稱 http://blog.csdn.net/success041000/article/details/6714195 1. 幾個概念 1)編譯:把源文件中的源代碼翻譯成機器語言,保存到目

C#堆

完成 time bool 語言 收集器 一段 兩個 介紹 在一起 解釋1、棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小 解釋2、 存放在棧中時要管存儲順序,

C# 圖片Base64互轉

name oba mar base64 richtext sender bin binary ram /// <summary> /// 將圖片數據轉換為Base64字符串 /// </summary> /// <pa