结论: 总数 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 } 运行截图: |
|