Hashtable Dictionary List 誰效率更高


一 前言 

  很少接觸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要慢呢?

 

 

 

如果您覺得本文有給您帶來一點收獲,不妨點個推薦,為我的付出支持一下,謝謝~

如果希望在技術的道路上能有更多的朋友,那就關注下我吧,讓我們一起在技術的路上奔跑


免責聲明!

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



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