不多接觸HashTable晚上回來簡單看了看,而後作一些增長和移除的操做,就想和List 與 Dictionary比較下存數據與取數據的差距,而後便有了以下的一此測試,數組
固然我測的方法可能不是很科學,但至少是我如今以爲比較靠譜的方法。若是朋友們有什麼好的方法,歡迎提出你們來交流下。數據結構
先來簡單介紹這三個容器的各自特色吧 函數
1 hashtable 散列表(也叫哈希表),是根據關鍵字(Key value)而直接訪問在內存存儲位置的數據結構。測試
2 List<T> 是針對特定類型、任意長度的一個泛型集合,實質其內部是一個數組。spa
3 Dictionary<TKey, TValue> 泛型類提供了從一組鍵到一組值的映射。字典中的每一個添加項都由一個值及其相關聯的鍵組成。經過鍵來檢索值,實質其內部也是散列表pwa
有了簡單的介紹後下面開始來比較了code
2.1 插入效率對象
先以10萬條爲基礎,而後增長到100萬blog
細心的園友發現我代碼存在不合理之處,在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要慢呢?
若是您以爲本文有給您帶來一點收穫,不妨點個推薦,爲個人付出支持一下,謝謝~
若是但願在技術的道路上能有更多的朋友,那就關注下我吧,讓咱們一塊兒在技術的路上奔跑