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要慢呢?

 

 

 

若是您以为本文有给您带来一点收获,不妨点个推荐,为个人付出支持一下,谢谢~

若是但愿在技术的道路上能有更多的朋友,那就关注下我吧,让咱们一块儿在技术的路上奔跑

相关文章
相关标签/搜索