分享

『性能』List 和 HashSet 查找性能比较

 印度阿三17 2019-03-30

结论:

总数 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 有优势

背景:

今天在项目中,需要用到一个 检索功能,只需要判断 指定的关键字 是否存在。

第一本能就想到了 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         }

运行截图:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多