『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )
结论:
总数 50000 (5万): List 检索 5W次 耗时 23秒, HashSet 检索 5W次 耗时 0.01秒。
总数 5000 (5千): List 检索 5K次 耗时 0.16秒, HashSet 检索 5K次 耗时 0.001秒。
总数 500 (5百): List 检索 500次 耗时 0.004秒, HashSet 检索 500次 耗时 0.000秒。
总数 50 : List 检索 50次 耗时 0.002秒, HashSet 检索 500次 耗时 0.000秒。
集合查找元素,
当总数超过 10 时, HashSet<T> 的检索性能 就会比 List<T> 快。
当总数超过 1000 时, List<T> 的检索性能 会 急速下降。
当总数超过 10000 时, List<T> 将会以 秒 为单位 的损失性能。
换言之:
> 无论怎样的数据量, HashSet<T> 的检索速度 都要比 List<T> 快。(不存在那种: 多少数据量以下,List 有优势,多少数据量以上,HashSet 有优势)
> Hastable 的查找性能 == HashSet 的查找性能,用不了 HashSet 可以用 Hashtable 替换。
背景:
今天在项目中,需要用到一个 检索功能,只需要判断 指定的关键字 是否存在。
第一本能就想到了 HashSet<T> 对象。
但,HashSet<T> 是 .Net 4.0 的东西,我希望自己的代码 无限兼容 .Net 2.0 —— 所以想避开这个东西。
其实,我的关键字 最多不过 20个,但是检索次数比较多 —— 所以,我就想看一下 List 和 HashSet 查找的 分水岭 在哪里。
测试代码:
static void Main(string[] args)
{
List<string> list = new List<string>();
HashSet<string> hash = new HashSet<string>(); //数据准备
for (int i = ; i < ; i++)
{
string str = Guid.NewGuid().ToString();
list.Add(str);
hash.Add(str);
}
Console.WriteLine("数据准备完成"); //list 的查找性能
DateTime time0 = DateTime.Now;
bool result0 = true;
foreach (string str in list)
{
bool v = list.Contains(str); //list 的查找性能
result0 = result0 && v;
}
DateTime time1 = DateTime.Now;
Console.WriteLine("从 {0} 的 List<string> 中, 判断数据是否存在, 耗时: {1}", list.Count, (time1 - time0).TotalSeconds); //hash 的查找性能
DateTime time2 = DateTime.Now;
bool result1 = true;
foreach (string str in list)
{
bool v = hash.Contains(str); //hash 的查找性能
result1 = result1 && v;
}
DateTime time3 = DateTime.Now;
Console.WriteLine("从 {0} 的 HashSet<string> 中, 判断数据是否存在, 耗时: {1}", hash.Count, (time3 - time2).TotalSeconds); Console.ReadKey();
}
运行截图:
Hashtable 性能:
.Net 2.0 没有 HashSet,但是有 Hashtable 和 Dictionary
Hashtable 支持 Key查找 和 Value查找
//hashtable - key 的查找性能
DateTime time4 = DateTime.Now;
bool result2 = true;
foreach (string str in list)
{
bool v = hash2.ContainsKey(str); //hashtable - key 的查找性能
result2 = result2 && v;
}
DateTime time5 = DateTime.Now;
Console.WriteLine("从 {0} 的 Hashtable 中, 判断Key是否存在, 耗时: {1}", hash2.Count, (time5 - time4).TotalSeconds); //hashtable - value 的查找性能
DateTime time6 = DateTime.Now;
bool result3 = true;
foreach (string str in list)
{
bool v = hash2.ContainsValue(str); //hashtable - value 的查找性能
result3 = result3 && v;
}
DateTime time7 = DateTime.Now;
Console.WriteLine("从 {0} 的 Hashtable 中, 判断Value是否存在, 耗时: {1}", hash2.Count, (time7 - time6).TotalSeconds);
测试结果如下:
『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )的更多相关文章
- 『性能』测试一下 MSSqlHelper 的性能
本文没啥技术含量,就是测试一下 MSSqlHelper 在 使用反射.不使用反射 的性能对比. 之后,不要问为什么不用 ORM 这类的东西 —— 会有另外的文章 介绍 自己这些年 自己的ORM 升级历 ...
- 『Numpy』内存分析_高级切片和内存数据解析
在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...
- 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...
- 『MXNet』第六弹_Gluon性能提升
一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...
- 『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程
https://www.cnblogs.com/hellcat/p/9084894.html 目录 一.符号式编程 1.命令式编程和符号式编程 2.MXNet的符号式编程 二.惰性计算 用同步函数实际 ...
- 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成
Fork版本项目地址:SSD 一.数据格式介绍 数据文件夹命名为VOC2012,内部有5个子文件夹,如下, 我们的检测任务中使用JPEGImages文件夹和Annotations文件夹. JPEGIm ...
- 『MXNet』专题汇总
MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...
- 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍
一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...
- Tair LDB基于Prefixkey中期范围内查找性能优化项目总结
"Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...
随机推荐
- javascript 易漏点
javascript 是一种解释型语言,不是java或c++那样的编译语言.javascript指令以普通文本形式传递给浏览器,然后依次解释执行.它们不必首先“编译”成只有计算机处理器能理解的机器码. ...
- Python2.7和3.5双版本共存和pip的使用
1. Python2.7和3.5并存 1.1 安装 安装自不必多说,先装2.7,再装3.5. 说下安装的目录:Py3.5和Py2.7默认的安装目录是不一样的,按默认的来就好,不用管. Python2. ...
- python之Flask实现登录功能
网站少不了要和数据库打交道,归根到底都是一些增删改查操作,这里做一个简单的用户登录功能来学习一下Flask如何操作MySQL. 用到的一些知识点:Flask-SQLAlchemy.Flask-Logi ...
- vue 使用踩坑 note
1. 如图,假如large那一行错写成 'large': item.ext_data.isLarge + '' === 'true',, 那么,编译不报错,控制台无提示,模板不输出. 2. vue的t ...
- Windows驱动开发入门指引
1. 前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软 ...
- Unity3D学习(五):实现一个简单的视觉感知
前言 在很多第一人称或者第三人称射击游戏的单人模式中,玩家的乐趣往往来源于和各式各样的AI敌人的战斗.而战斗的爆发很多时候是因为这些AI在"看见"玩家后就会立即做出反应,比如开火. ...
- java正则表达式验证金额
String reg_money = "\\d+(\\.\\d{1,2})?";// 金额正则,可以没有小数,小数最多不超过两位 Pattern pattern = Pattern ...
- Oracle-02:SQL语言的分类或者说SQL语言的组成
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 小结一版: 01.DDL(Data Definition Language)数据定义语言. 用来创建数据库中 ...
- ASP.NET Core & Docker 实战经验分享
一.前言 最近一直在研究和实践ASP.NET Core.Docker.持续集成.在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助. 二.中间镜像 我 ...
- SQLMap入门之在Windows上安装SQLMap
前言: SQLMap是一个开放源代码的sql注入工具,SQLMap是使用Python语言开发成的,他的运行需要有Python环境的支持.写这篇文章时我使用的SQLMap版本是"sqlmap- ...