结论:

总数 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 )的更多相关文章

  1. 『性能』测试一下 MSSqlHelper 的性能

    本文没啥技术含量,就是测试一下 MSSqlHelper 在 使用反射.不使用反射 的性能对比. 之后,不要问为什么不用 ORM 这类的东西 —— 会有另外的文章 介绍 自己这些年 自己的ORM 升级历 ...

  2. 『Numpy』内存分析_高级切片和内存数据解析

    在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...

  3. 【SQL server初级】数据库性能优化一:数据库自身优化(大数据量)

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第一部分 数据库性能优化一:数据库自身优化 优化①:增加次数据文件,设置文件自动增长(粗略数据分区) 1.1:增加次数据文 ...

  4. 『MXNet』第六弹_Gluon性能提升

    一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...

  5. 『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程

    https://www.cnblogs.com/hellcat/p/9084894.html 目录 一.符号式编程 1.命令式编程和符号式编程 2.MXNet的符号式编程 二.惰性计算 用同步函数实际 ...

  6. 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成

    Fork版本项目地址:SSD 一.数据格式介绍 数据文件夹命名为VOC2012,内部有5个子文件夹,如下, 我们的检测任务中使用JPEGImages文件夹和Annotations文件夹. JPEGIm ...

  7. 『MXNet』专题汇总

    MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...

  8. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  9. Tair LDB基于Prefixkey中期范围内查找性能优化项目总结

    "Tair LDB基于Prefixkey该范围内查找性能优化"该项目是仅一个月.这个月主要是熟悉项目..以下从几个方面总结下个人在该项目上所做的工作及自己的个人所得所感. 项目工作 ...

随机推荐

  1. mysql-列属性

    列属性 列属性是真正约束字段的数据类型,但是数据类型的约束很单一,需要有一些额外的约束来确保数据的合法性 NULL/NOT NULL.default.primary key.unique key.au ...

  2. UE4笔记:利用Widget设计一个切换材质功能

    UE4引擎中的Widget蓝图是一个重要的工具,可用于场景中的页面叠加,镜头绑定,场景切换等多处地方,在这里笔者介绍一种利用控件蓝图和场景中物体进行信息交互的方法,直观的体现就是进行物体的材质切换. ...

  3. session熟知

    Session 服务器端保存会话信息的技术. //如何获得session HttpSession session = request.getSession(); //如何操作session sessi ...

  4. JS 数据类型、赋值、深拷贝和浅拷贝

    js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 ...

  5. redux 中间件 --- applyMiddleware 源码解析 + 中间件的实战

    前传  中间件的由来 redux的操作的过程,用户操作的时候,我们通过dispatch分发一个action,纯函数reducer检测到该操作,并根据action的type属性,进行相应的运算,返回st ...

  6. 【网络】TCP/IP连接三次握手

    TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...

  7. 阅读GIC-500 Technical Reference Manual笔记

    GIC-500是ARM GICv3的一个实现,它只支持ARMv8核和实现了GIC Stream协议的GIC CPU Interface,比如Cortex-A53. 关于GIC有四份相关文档:<C ...

  8. ReactNative(三)——WebStorm的基本配置

    设置.js文件默认以jsx的语法打开 在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示: 当然我们点击转换后就可以了,但是每次都会提示,所以还是来一个 ...

  9. Loadrunner 11 中Run-Time Setting详细参数说明

    .General/Run Logic :用来设置运行脚本迭代的次数,迭代次数只对run部分的脚本迭代次数有影响,对init和End部分无印象.一般设置未1~3次,只会影响在单位时间内客户端想服务器提交 ...

  10. 你不知道的JavaScript--Item28 垃圾回收机制与内存管理

    1.垃圾回收机制-GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...