Hashtable Dictionary List 誰效率更高

一 前言 

  不多接觸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要慢呢?

 

 

 

若是您以爲本文有給您帶來一點收穫,不妨點個推薦,爲個人付出支持一下,謝謝~

若是但願在技術的道路上能有更多的朋友,那就關注下我吧,讓咱們一塊兒在技術的路上奔跑

相關文章
相關標籤/搜索