C# Hashtable VS. Dictionary 性能对比
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、C#中Hashtable、Dictionary详解以及写入和读取对比
		在本文中将从基础角度讲解HashTable.Dictionary的构造和通过程序进行插入读取对比. 一:HashTable 1.HashTable是一种散列表,他内部维护很多对Key-Value键值对 ... 
- C#中Hashtable、Dictionary详解以及写入和读取对比
		转载:http://www.cnblogs.com/chengxingliang/archive/2013/04/15/3020428.html 在本文中将从基础角度讲解HashTable.Dicti ... 
- C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
		C#中HashTable.Dictionary.ConcurrentDictionar三者都表示键/值对的集合,但是到底有什么区别,下面详细介绍 一.HashTable HashTable表示键/值对 ... 
- Hashtable、Dictionary和List 谁效率更高
		一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存数据与取数据的差距,然后便有了如下的一此测试, 当然我测的方法可能不 ... 
- 深入解析Hashtable、Dictionary、SortedDictionary、SortedList
		我们先看Hashtable. MSDN的解释:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织. Hash算法是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定 ... 
- 再看ExpressionTree,Emit,反射创建对象性能对比
		[前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ... 
- C# Hashtable vs Dictionary 学习笔记
		Hashtable 和 Dictionary 存储的都是键值对,我的理解是Dictionary是Hashtable的泛型实现. Hashtable的键和值都是object类型.所以,key和value ... 
- 2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比
		原文:2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比 title author date CreateT ... 
- [转帖]C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
		C#中字典集合HashTable.Dictionary.ConcurrentDictionary三者区别 https://blog.csdn.net/yinghuolsx/article/detail ... 
随机推荐
- LVGL库入门教程03-布局方式
			LVGL布局方式 LVGL的布局 上一节介绍了如何在 LVGL 中创建控件.如果在创建控件时不给控件安排布局,那么控件默认会被放在父容器的左上角. 可以使用 lv_obj_set_pos(obj, x ... 
- 《Java基础——IO流》
			Java基础--IO流 一.字节流: 1.输入流 (InputStream) 规则: 此处用于读取txt文件中的内容. 代码: import java.io.*; public c ... 
- BUUCTF-后门查杀
			后门查杀 后门查杀这种题最好还是整个D盾直接扫描目录方便. 查看文件得到flag 
- 【Pr】基础流程
			新建工程 1.打开Pr 2.点击"新建""项目" 3.在电脑磁盘上新建好项目想要存放的位置,比如Demo1,为了便于管理,我先新建了一个Demo文件夹,再在里边 ... 
- FS2K人脸素描属性识别
			人脸素描属性识别 代码:https://github.com/linkcao/FS2K_extract 问题分析 需要根据FS2K数据集进行训练和测试,实现输入一张图片,输出该图片的属性特征信息,提取 ... 
- Python简单实现自动评论、自动点赞、自动关注脚本
			一些哔哔: 今天的这个脚本,是一个别人发的外包,交互界面的代码就不在这里说了,但是可以分享下自动评论.自动点赞.自动关注.采集评论和视频的数据是如何实现的 开发环境 python 3.8 运行代码py ... 
- 求求你们,别再刷 Star 了!这跟“爱国”没关系!
			这几年,随着几大互联网公司的强大,纷纷投入云计算产业的建设,开源项目作为维护潜在客户群体(开发者)的重要手段,是各大云计算厂商都在努力做的事. 这几年也诞生了很多真正优秀和看似优秀的开源项目.真正优秀 ... 
- NC16539 [NOIP2013]表达式求值
			NC16539 [NOIP2013]表达式求值 题目 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 输入仅有一行,为需要你计算的表达式,表达式中只包含数字.加法运 ... 
- 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC
			摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ... 
- 数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)
			一个数码管有九个引脚,控制八段二极管的亮灭,用以显示需要的数字. 当有N个数码管时,一个一个控制的话需要N x 9 个引脚,消耗资源较多. 因此可以利用动态显示的方案通过人眼的视觉暂留特性达到静态显示 ... 
