一 前言
很少接觸HashTable晚上回來簡單看了看,然后做一些增加和移除的操作,就想和List 與 Dictionary比較下存數據與取數據的差距,然后便有了如下的一此測試,
當然我測的方法可能不是很科學,但至少是我現在覺得比較靠譜的方法。如果朋友們有什么好的方法,歡迎提出大家來交流下。
先來簡單介紹這三個容器的各自特點吧
1 hashtable 散列表(也叫哈希表),是根據關鍵字(Key value)而直接訪問在內存存儲位置的數據結構。
2 List<T> 是針對特定類型、任意長度的一個泛型集合,實質其內部是一個數組。
3 Dictionary<TKey, TValue> 泛型類提供了從一組鍵到一組值的映射。字典中的每個添加項都由一個值及其相關聯的鍵組成。通過鍵來檢索值,實質其內部也是散列表
有了簡單的介紹后下面開始來比較了
二 效率比較
2.1 插入效率
先以10萬條為基礎,然后增加到100萬
細心的園友發現我代碼存在不合理之處,在Hashtable 與Dictionary中都有發生裝箱操作,所以重定定義了兩個object類型參數以避免裝箱
結果也有區別了
Hashtable hashtable = new Hashtable(); List<string> list = new List<string>(); Dictionary<string, object> dic = new Dictionary<string, object>();
object value1 =123;
object value2 =456; var watchH = new Stopwatch(); var watchL = new Stopwatch(); var watchD = new Stopwatch(); //Hashtable watchH.Start(); for (int i = 0; i < 100000; i++) { hashtable.Add( i.ToString(), value1); } Console.WriteLine(watchH.Elapsed); //List watchL.Start(); for (int i = 0; i < 100000; i++) { list.Add(i.ToString()); } Console.WriteLine(watchL.Elapsed); //Dictionary watchD.Start(); for (int i = 0; i < 100000; i++) { dic.Add(i.ToString(), value2); } Console.WriteLine(watchD.Elapsed); Console.WriteLine("插入結束!");
10萬結果如下測試3次以上
100萬結果如下測試3次以上
2.2 結論
1 不管是10萬還是100萬List集合所用的時間總是最少的,我想這與其內部是數組有關,都是按順序插入而且大小是一至的,在空間上應該占用是最小的
2 Hashtable在10萬次時,所花時間多於List,比List時間多我想是因為要把Key做一個散列值計算 在這一步會花掉部分時間,空間上占用應該要比List大得多,因為散列值是無序的。
3 Dictionary 這個結果讓我不太明白了,內部同樣也是Hashtable也要做散列值計算,為什么要比原生的hashtable花的時間更少呢?
求助朋友們~~!!
2.3 查找效率
同樣以10萬次和100萬次做測試 插入的代碼就不重復貼與上面一致
var watchH = new Stopwatch(); var watchL = new Stopwatch(); var watchD = new Stopwatch(); //HashTable watchH.Start(); object valueH = hashtable["90000"]; Console.WriteLine(watchH.Elapsed); //List watchL.Start(); string valueL = list.Find(o => o == "90000"); Console.WriteLine(watchL.Elapsed); //Dictionary watchD.Start(); object valurd = dic["90000"]; Console.WriteLine(watchD.Elapsed); Console.WriteLine("查找完畢!"); Console.Read();
在10萬次的情況下
在100萬次的情況下
2.4 結論
1 Hashtable 不認在10萬次還是100萬次的情況下在查找時速度都是驚人的快為什么會這么快呢,我用超精減的話說,hashtable在存數據時會把key通過散列函數計算出地址然后存入,那在取值同樣把key通過散列函數計算出地址,然后直接取值,所以速度很快
2 Dictionary 因其內部是Hashtable所以速度也很快,但總是要比Hashtable慢一點,我猜這與Dictionary把Hashtable當做自己的數據容器時應該有相應的代碼來操作,可能是這些代碼花掉了時間,當然這個只是我的猜測 至於真正原因 我 再一次求助朋友們~~!!
3 List 這個就簡單了要想在數組中查找一條記錄唯一的辦法就是遍歷數組,而且我試過把查找的對象換成"0"與"999999"兩者的時間差距非常大,也更足以證明了List的查找是用遍歷的方式處理的
三 總結
通過對三種數據結構做插入與查找的對比,還是有亮點的,至少讓我知道原來Hashtable是這么的強悍,對於需要從大量唯一數據中查找唯一值時Hashtable是很值得考慮的,
但是hashtable是用空間來換取時間的,花的時間少了點用的空間就必然大了,而List則用時間來換取空間的,總是三種數據結構各自己有各自存在的優點,我們應該在合理的情況下合理的使用這三種結構,本文也只是單一的從效率上測試而以。
另外 文章我還有兩個疑問希望園子里的朋友們能指點一二 謝謝~
1 Dictionary 內部同樣也是Hashtable也要做散列值計算,為什么在插入數據時要比原生的hashtable要快呢?
2 Dictionary 內部實質也是hashtable為什么在查找時總是要比原生的Hashtable要慢呢?
如果您覺得本文有給您帶來一點收獲,不妨點個推薦,為我的付出支持一下,謝謝~
如果希望在技術的道路上能有更多的朋友,那就關注下我吧,讓我們一起在技術的路上奔跑