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 ...
随机推荐
- Git镜像
http://npm.taobao.org/mirrors/git-for-windows/v2.34.1.windows.1/ Git 阿里镜像,高速 下载
- 我的开源之路:耗时 6 个月发布线程池框架,GitHub 1.7k Star!
文章首发在公众号(龙台的技术笔记),之后同步到掘金和个人网站:xiaomage.info Hippo4J 线程池框架经过 6 个多月的版本迭代,2022 年春节当天成功发行了 1.0.0 RELEAS ...
- CVPR2022 | 弱监督多标签分类中的损失问题
前言 本文提出了一种新的弱监督多标签分类(WSML)方法,该方法拒绝或纠正大损失样本,以防止模型记忆有噪声的标签.由于没有繁重和复杂的组件,提出的方法在几个部分标签设置(包括Pascal VOC 20 ...
- XSS攻击(笔记)
XSS攻击 XSS概述 XSS即跨站脚本攻击,(Cross-Site Scripting, CSS),但是为了与层叠样式表(Cascading Style Sheets, CSS)缩写区分开来,所以命 ...
- 不同network中的两个docker容器
1. 创建docker网络 docker network create --subnet 172.18.0.1/16 test docker network ls 2. 创建两个容器指定docker ...
- 几百行代码实现一个 JSON 解析器
前言 之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来. 一次无意间看到有人提起 JSON 解析器,这类工具充斥着我们的日常开 ...
- (数据科学学习手札140)详解geopandas中基于pyogrio的矢量读写引擎
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前不久我在一篇文章中给大家分享 ...
- Redis基础课程讲义
Redis基础 课程内容 Redis入门 Redis数据类型 Redis常用命令 在Java中操作Redis 1. 前言 1.1 什么是Redis Redis是一个基于内存的key-value结构数据 ...
- Office共享协作方法——Office共享的正确打开方式、office365白嫖
OFFICE共享协作方法: 1.OFFICE365激活<推荐.一劳永逸.体验最新版office,协作体验更佳> 一部分用户自带的Office可以用KMS直接激活,那就ok了,注意激活前关闭 ...
- Dos系统操作小技巧汇总(不定时更新)
1.笔者发现有时候自己的程序取名如果太长的话,每次使用gcc编译的时候自己手打的话会非常痛苦,在dos下有一个非常方便的方法,那就是打出相关程序的前几个字母,然后就可以通过tab键来切换相关程序名,非 ...