首页 > 其他分享 >『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )

『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )

时间:2024-07-22 10:41:10浏览次数:13  
标签:检索 HashSet 性能 List DateTime 查找 数据量

最近优化代码性能采用此方法效率明显提升,特此与大家共勉,同时感谢作者的无私分享!

原作者文字地址:https://www.cnblogs.com/shuxiaolong/p/List_HashSet.html

『性能』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 查找的 分水岭 在哪里。

 

 

测试代码:

复制代码
 1         static void Main(string[] args)
 2         {
 3             List<string> list = new List<string>();
 4             HashSet<string> hash = new HashSet<string>();
 5 
 6             //数据准备
 7             for (int i = 0; i < 5000; i++)
 8             {
 9                 string str = Guid.NewGuid().ToString();
10                 list.Add(str);
11                 hash.Add(str);
12             }
13             Console.WriteLine("数据准备完成");
14 
15 
16             //list 的查找性能
17             DateTime time0 = DateTime.Now;
18             bool result0 = true;
19             foreach (string str in list)
20             {
21                 bool v = list.Contains(str); //list 的查找性能
22                 result0 = result0 && v;
23             }
24             DateTime time1 = DateTime.Now;
25             Console.WriteLine("从 {0} 的 List<string> 中, 判断数据是否存在, 耗时: {1}", list.Count, (time1 - time0).TotalSeconds);
26 
27 
28 
29             //hash 的查找性能
30             DateTime time2 = DateTime.Now;
31             bool result1 = true;
32             foreach (string str in list)
33             {
34                 bool v = hash.Contains(str); //hash 的查找性能
35                 result1 = result1 && v;
36             }
37             DateTime time3 = DateTime.Now;
38             Console.WriteLine("从 {0} 的 HashSet<string> 中, 判断数据是否存在, 耗时: {1}", hash.Count, (time3 - time2).TotalSeconds);
39 
40 
41             Console.ReadKey();
42         }
复制代码

 

运行截图:

 

 

 

Hashtable 性能:

.Net 2.0 没有 HashSet,但是有 Hashtable 和 Dictionary 

Hashtable 支持  Key查找 和 Value查找

 

复制代码
 1             //hashtable - key 的查找性能
 2             DateTime time4 = DateTime.Now;
 3             bool result2 = true;
 4             foreach (string str in list)
 5             {
 6                 bool v = hash2.ContainsKey(str); //hashtable - key 的查找性能
 7                 result2 = result2 && v;
 8             }
 9             DateTime time5 = DateTime.Now;
10             Console.WriteLine("从 {0} 的 Hashtable 中, 判断Key是否存在, 耗时: {1}", hash2.Count, (time5 - time4).TotalSeconds);
11 
12 
13             //hashtable - value 的查找性能
14             DateTime time6 = DateTime.Now;
15             bool result3 = true;
16             foreach (string str in list)
17             {
18                 bool v = hash2.ContainsValue(str); //hashtable - value 的查找性能
19                 result3 = result3 && v;
20             }
21             DateTime time7 = DateTime.Now;
22             Console.WriteLine("从 {0} 的 Hashtable 中, 判断Value是否存在, 耗时: {1}", hash2.Count, (time7 - time6).TotalSeconds);
复制代码

测试结果如下:

标签:检索,HashSet,性能,List,DateTime,查找,数据量
From: https://www.cnblogs.com/sdjxcolin/p/18315593

相关文章

  • Java性能优化-String的intern()方法的使用减少内存消耗
    场景String.intern()String.intern()方法用于在字符串常量池中查找是否存在与指定字符串相等的字符串。如果找到了,就返回该字符串的引用;否则,就在字符串常量池中创建一个新的字符串对象,并返回对它的引用。这个方法对于避免创建重复的字符串对象非常有用,特别是在处理大量字符串......
  • PHP 高性能框架 Workerman 凭什么能硬刚 Swoole ?
    大家好,我是码农先森。一次偶然看到了国外某机构针对PHP周边生态框架及扩展的性能测试排行榜,看到Workerman竟遥遥领先Swoole。在我们PHP程序员现有的认知里,Swoole作为一个基于C/C++语言编写的扩展程序,性能居然落后了。第一眼看到这个结果的时候,我的心情久久不能平复,脑子......
  • 微服务设计原则——高性能:锁
    文章目录1.锁的问题2.无锁2.1串行无锁2.2无锁数据结构3.减少锁竞争参考文献1.锁的问题高性能系统中使用锁,往往带来的坏处要大于好处。并发编程中,锁带解决了安全问题,同时也带来了性能问题,因为锁让并发处理变成了串行操作,所以如无必要,尽量不要显式使用锁。锁和并......
  • 数据库的性能调优:如何正确的使用索引?
    在当今的数据驱动时代,数据库的性能优化成为每个开发者和数据库管理员必须掌握的技能之一。而在众多优化手段中,索引的使用无疑是最为重要和有效的。然而,索引的滥用或误用不仅不会提升性能,反而可能带来额外的开销。那么,如何正确地使用索引,才能真正提升数据库性能呢?为什么有时我们......
  • SQL Server性能优化秘籍:自定义统计信息收集的艺术
    SQLServer性能优化秘籍:自定义统计信息收集的艺术在数据库管理中,统计信息是优化查询性能的关键。SQLServer通过自动收集统计信息来帮助查询优化器选择最佳的执行计划。然而,在某些情况下,自动收集可能不足以满足特定需求。本文将详细介绍如何在SQLServer中实现数据库的自定......
  • 干货| Python代码性能优化总结
    本文会介绍不少的Python代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则。第一个基本原则:不要过早优化很多人一开始写代码就奔着性能优化的目标,“让正确的程序更快要比让快速的程序正确容易得多”。因此,优化的前提是代码能正常工作。过早地进......
  • 数据结构 - HashSet
    概述java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出......
  • Spring cloud 安全部署与性能优化
    Mr.NeoChen(陈景峯),netkiller,BG7NYT节选自《NetkillerSpringCloud手札》多维度架构-知乎​www.zhihu.com/club/1241768772601950208​编辑1.环境安装1.1.操作系统初始化操作系统按完成后,使用下面脚本做一次初始化curl-shttps://raw.githubusercontent.co......
  • ​硅纪元视角 | 阿里云GPU云服务升级:AI大模型推理性能翻倍
    在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,分享独到的视角和思考;精选对您有价值的信息,帮助您在AI时代中把握机遇。1分钟速览新闻  阿......
  • [实践篇]13.29 QNX下的系统性能监控工具 - sysMonAppQNX(一)
    一,sysMonAppQNX工具简介sysMonAppQNX,即SystemMonitorApplicationforQNX;它是有QNX开发的系统监控应用程序。它用于监控QNX系统的性能和健康状况。sysMonAppQNX可以监视各种指标,包括CPU使用率、内存使用率、磁盘I/O、网络流量和进程活动。它还可以生成警报以指示潜在......