Hashtable VS Dictionary

  • 因为Hashtable的Key和Value都是object类型,所以在使用值类型的时候,必然会出现装箱和拆箱的操作,因此性能肯定是不如Dictionary的,在此就不做过多比较了。

在此仅比较<string,string>的情况

class Program
{
static void Main(string[] args)
{ int nTimes = 10000; //排除定时器启动误差
Stopwatch sw_D = new Stopwatch(); sw_D.Restart(); for (int i = 0; i < 10; i++)
{
Thread.Sleep(100);
} sw_D.Stop(); //Dictionary部分
Dictionary<string, string> dict = new Dictionary<string, string>(); sw_D.Restart(); for (int i = 0; i < nTimes; i++)
{
string str = i.ToString(); dict.Add(str, str);
} sw_D.Stop(); decimal decTime_D = sw_D.ElapsedTicks / (decimal)Stopwatch.Frequency; Console.WriteLine(decTime_D); sw_D.Restart(); for (int i = 0; i < nTimes; i++)
{
string str = dict[i.ToString()];
} sw_D.Stop(); decTime_D = sw_D.ElapsedTicks / (decimal)Stopwatch.Frequency; Console.WriteLine(decTime_D); //Hashtable部分
Hashtable hashtable = new Hashtable(); Stopwatch sw_H = new Stopwatch(); sw_H.Restart(); for (int i = 0; i < nTimes; i++)
{
string str = i.ToString(); hashtable.Add(str, str);
} sw_H.Stop(); decimal decTime_H = sw_H.ElapsedTicks / (decimal)Stopwatch.Frequency; Console.WriteLine(decTime_H); sw_H.Restart(); for (int i = 0; i < nTimes; i++)
{
object obj = hashtable[i.ToString()];
} sw_H.Stop(); decTime_H = sw_H.ElapsedTicks / (decimal)Stopwatch.Frequency; Console.WriteLine(decTime_H); Console.ReadKey(); }
}
  • 在10000的数量级

    第一次计算Dictionary的误差比较大,相差有1/2之多。

    总体来看,Hashtable在查询上比Dictionary要强
0.0016746
0.0021346
0.0015785
0.0011693
  • 在100000的数量级

    这一次,不管怎么样,Dictionary都要强于Hashtable,这就很奇怪了
0.0155579
0.0150943
0.0196156
0.0189904

而且很明显的,Dictionary的时间要小于之前的上一个数量级中的10倍,也就是在数据量较大的时候对性能做了优化?

相反,Hashtable的时间显然是要大于之前的10倍的,也就是占用内存变大了很多之后,hashtable的性能降低了很多。

为了继续验证是不是在数据量较小的时候,是不是Hashtable性能更优,再测试一下100的数量级

  • 在100的数量级

    很明显,Hashtable要远强于Dictionary。
0.0001577
0.0000612
0.0000435
0.0000344

总结

在都是引用类型的情况下,数量级较小,可以将Dictionary改成Hashtable使用。数量级较大,建议选择Dictionary。

至于为什么在大数量级别下会出现“反转”,这个还有待后面考量。

不过可以预见的是,在WPF中依赖属性都存在于一张Hashtable,在数量较小的时候,是没啥问题的。

C# Hashtable VS. Dictionary 性能对比的更多相关文章

  1. 1、C#中Hashtable、Dictionary详解以及写入和读取对比

    在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 一:HashTable 1.HashTable是一种散列表,他内部维护很多对Key-Value键值对 ...

  2. C#中Hashtable、Dictionary详解以及写入和读取对比

    转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ...

  3. C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中HashTable.Dictionary.ConcurrentDictionar三者都表示键/值对的集合,但是到底有什么区别,下面详细介绍 一.HashTable HashTable表示键/值对 ...

  4. Hashtable、Dictionary和List 谁效率更高

    一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存数据与取数据的差距,然后便有了如下的一此测试, 当然我测的方法可能不 ...

  5. 深入解析Hashtable、Dictionary、SortedDictionary、SortedList

    我们先看Hashtable. MSDN的解释:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织. Hash算法是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定 ...

  6. 再看ExpressionTree,Emit,反射创建对象性能对比

    [前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ...

  7. C# Hashtable vs Dictionary 学习笔记

    Hashtable 和 Dictionary 存储的都是键值对,我的理解是Dictionary是Hashtable的泛型实现. Hashtable的键和值都是object类型.所以,key和value ...

  8. 2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比

    原文:2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比 title author date CreateT ...

  9. [转帖]C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中字典集合HashTable.Dictionary.ConcurrentDictionary三者区别 https://blog.csdn.net/yinghuolsx/article/detail ...

随机推荐

  1. Zookeeper分布式锁实现Curator十一问

    前面我们剖析了Redisson的源码,主要分析了Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性.这篇文章就来接着剖析Zookeeper分布式 ...

  2. 17.Nginx 重写(location rewrite)

    Nginx 重写(location / rewrite) 目录 Nginx 重写(location / rewrite) 常见的nginx正则表达式 location lication的分类 loca ...

  3. UiPath培训教程

    匠厂出品,必属精品   Uipath中文社区qq交流群:465630324 uipath中文交流社区:https://uipathbbs.comRPA之家qq群:465620839 第一课--UiPa ...

  4. python简单处理验证码,三分钟,不能再多了

    序言 大家好鸭, 又是我小熊猫啦 我们在做采集数据的时候,过快或者访问频繁,或者一访问就给弹出验证码,然后就蚌珠了~今天就给大家来一个简单处理验证码的方法 环境模块 Python和pycharm如果还 ...

  5. Nginx通过bat文件快速启动停止

    新建文本文件NginxRun.bat.(名字无所谓,后缀名得是bat) 将以下代码复制到bat文件中即可. @echo off ::进入D盘 d: ::进入nginx目录 这里是自己的nginx目录 ...

  6. 【RocketMQ】消息的存储

    Broker对消息的处理 BrokerController初始化的过程中,调用registerProcessor方法注册了处理器,在注册处理器的代码中可以看到创建了处理消息发送的处理器对象SendMe ...

  7. NC212914 牛牛与后缀表达式

    NC212914 牛牛与后缀表达式 题目 题目描述 给定牛牛一个后缀表达式 \(s\) ,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,'#'作为操作数的结束符号. 其中,表达式中只含有'+ ...

  8. 018(Phone List)(字典树)

    题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1471 题目思路: 这不就是一个超级明显的字典树嘛 字典树,又称单词查找树,Trie树,是一种树形 ...

  9. Cayley 定理与扩展 Cayley 定理

    Cayley 定理 节点个数为 \(n\) 的无根标号树的个数为 \(n^{n−2}\) . 这个结论在很多计数类题目中出现,要证明它首先需要了解 \(\text{Prufer}\) 序列的相关内容. ...

  10. CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析

    目录 1. 3DTiles 数据集的类型 2. 创建瓦片树 2.1. 请求入口文件 2.2. 创建树结构 2.3. 瓦片缓存机制带来的能力 3. 瓦片树的遍历更新 3.1. 三个大步骤 3.2. 遍历 ...