在List泛型中查找一个值(唯一),究竟用哪种方法快点呢。for循环、foreach迭代器、Lambda表达式、Linq语句。

简单的写了一个程序测试一下。思路:构造一个有26843545个int元素List泛型(从小到大)。然后复制四份,准备用于查找。随机生成一个查找内容,用Stopwatch来检查运行时间。

代码如下:

全部代码

 1 static void Main(string[] args)
 2         {
 3             Stopwatch sw = new Stopwatch();
 4             Random rand=new Random();
 5             string output = "{0}运行使用了{1}毫秒";
 6
 7             List<int> intlist = new List<int>();
 8             const int length = 26843545;
 9             int temp;
10
11             for (int i = 0; i < length; i++)
12             {
13                 intlist.Add(i);
14             }
15
16             int target = rand.Next(length);
17
18             Console.WriteLine("总长度{0},查找对象{1}", length, target);
19
20             List<int> forlist = new List<int>(); ;
21             forlist.Clear();
22             forlist.AddRange(intlist);
23
24             List<int> lambdalist = new List<int>();
25             lambdalist.Clear();
26             lambdalist.AddRange(intlist);
27
28             List<int> foreachlist = new List<int>();
29             foreachlist.Clear();
30             foreachlist.AddRange(intlist);
31
32             List<int> linqlist = new List<int>();
33             linqlist.Clear();
34             linqlist.AddRange(intlist);
35             //------------------------------------
36             // for
37             sw.Reset();
38             sw.Start();
39             for (int i = 0; i < length; i++)
40             {
41                 if (forlist[i]==target)
42                 {
43                     temp = forlist[i];
44                     sw.Stop();
45                     Console.WriteLine(output, "for循环",sw.ElapsedMilliseconds);
46                 }
47             }
48             //----------------------------------------------------------
49             //foreach
50             sw.Reset();
51             sw.Start();
52             foreach (int item in foreachlist)
53             {
54                 if (item == target)
55                 {
56                     temp = item;
57                     sw.Stop();
58                     Console.WriteLine(output, "foreach循环", sw.ElapsedMilliseconds);
59                 }
60             }
61             //------------------------------------------------
62             //lambda
63             sw.Reset();
64             sw.Start();
65            temp= lambdalist.Where(x => x == target).First();
66             sw.Stop();
67             Console.WriteLine(output, "Lambda表达式", sw.ElapsedMilliseconds);
68             //----------------------------------------------------
69             //Linq
70             sw.Reset();
71             sw.Start();
72             temp = (from y in linqlist
73                     where y == target
74                     select y).First();
75             sw.Stop();
76             Console.WriteLine(output, "Linq查询", sw.ElapsedMilliseconds);
77             //-----------------------------------------------------------
78             Console.Read();
79         }

测试环境,core 2 duo P9400 2.4G双核,8G内存,win7 x64旗舰版。测试的结果,单位毫秒

查找对象 for foreach Lambda Linq
25069205 242 286 296 294
5377884 52 62 70 63
11283402 110 129 140 134
5164132 52 59 66 59
23708079 239 274 518 514
26363083 271 308 576 568
1538372 15 17 23 18
7191108 70 84 91 85
3376391 33 39 46 39
9636456 91 171 119 113
23588001 233 276 385 289

简单的看出在百万个元素左右,差异并不十分大。总体性能for是最快,Lambda最低,但是Lambda和Linq基本差不多,性能比直接循环和迭代慢多了。

原因大致看了一下。在调用Where这个方法的时候,其实是用了很多层委托去调用,一直到调用Enumerable.CombinePredicates方法。

这个方法的实现代码

CombinePredicates实现

 1 private static Func<TSource, bool> CombinePredicates<TSource>(Func<TSource, bool> predicate1, Func<TSource, bool> predicate2)
 2 {
 3     return delegate (TSource x) {
 4         if (predicate1(x))
 5         {
 6             return predicate2(x);
 7         }
 8         return false;
 9     };
10 }
11
12
13
14  

可见,Linq的写法是提高程序员的编程效率,而执行效率是会降低的。但是在现在的硬件环境下,一般的数据容量这些降低可以忽略。但是如果你的数据量有1亿,就另当别论。不过,就我的这个程序,消耗内存也挺大的,一个控制台程序都要600多M内存(一共有5个千万单元的list喔^_^)。

转载于:https://www.cnblogs.com/Bonizlee/archive/2012/07/31/2616599.html

简单测试lambda和linq查找的性能相关推荐

  1. INNODB在裸设备上的性能简单测试

    INNODB在裸设备上的性能简单测试     裸设备简单测试 2009年4月28日 我这里用的SUN VBOX以及SUPER-SMACK来得到的数据. 至于SUPER-SMACK的介绍参见我以前的文章 ...

  2. android ORM框架的性能简单测试(androrm vs ormlite)

    2019独角兽企业重金招聘Python工程师标准>>> 前言 看了一下现在的android设备,性能都不差,就懒得直接用sqlite,直接上ORM框架把,上网搜了一圈,觉得andro ...

  3. MySQL中MyISAM引擎与InnoDB引擎性能简单测试[转]

    MySQL中MyISAM引擎与InnoDB引擎性能简单测试 [硬件配置] CPU : AMD2500+ (1.8G) 内存: 1G/现代 硬盘: 80G/IDE [软件配置] OS : Windows ...

  4. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  5. JMeter测试TCP/IP Socket应用的性能

    摘要 本文描述了如何利用JMeter来测试TCP/IP Socket应用的性能.文章先对Socket作了一点简单介绍,然后提供并解释了两个样例Socket应用,最后介绍如何利用JMeter来对它们进行 ...

  6. 二分查找树性能分析(Binary Search Tree Performance Analysis)

    经典算法系(21)-二分查找树性能分析(Binary Search Tree Performance Analysis)https://www.douban.com/note/221942390/   ...

  7. C#switch语句简单测试

    switch的简单测试..... 代码: using System; using System.Collections.Generic; using System.Linq; using System ...

  8. Java 8:测试Lambda水

    Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression . 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9.但是,将lambda表达式(或闭包 ...

  9. 第十二节:Lambda、linq、SQL的相爱相杀(1)

    一. 谈情怀  Lambda.Linq.SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用. 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学 ...

最新文章

  1. oracle过滤某个字段重复记录,只获取一条记录
  2. Angular 项目 ng serve 背后发生的事情
  3. 设置仿真器H-JTAG ARM仿真器和MDK 联调设置
  4. java对象复制 忽略空值_优秀!高级Java都这样优雅处理空值
  5. python高效办公 知乎_骚操作|高效办公,Python自动化教你一键获取日志!
  6. 2021SC@SDUSC——使用CUDA/GPU技术加速密码运算(一)
  7. EXPRESS语言与IFC体系
  8. mimics软件临床应用.计算机辅助外科入门技术,Mimics软件临床应用 计算机辅助外科入门技术.pdf...
  9. 数据分析师,数据挖掘工程师和数据研发工程师有什么区别?
  10. 数据中心设计方案 实例,数据中心网络设计方案
  11. 易基因 | 文献速递:重亚硫酸盐扩增子测序研究通过DNA甲基化监测急性髓系白血病MRD
  12. python超清壁纸_python爬虫 爬取超清壁纸代码实例
  13. UE4 后处理材质 镜头光晕(Lensflare)效果
  14. C语言作业-小学生测验
  15. matlab三个简单物理建模实例(笔记)
  16. AMD处理器下虚拟机VMware15安装macOS 10.14
  17. 记录VS2015编译cuda11+opencv库遇到的问题
  18. 华为主题 主题兑换券活动高端操作
  19. 小米4c刷机包Linux,MIUI【双开应用】数据备份(android通用,分身数据)
  20. 原生js实现的金山打字小游戏

热门文章

  1. [leetcode] 150. 逆波兰表达式求值
  2. 数据库期末总结笔记( 零基础 )-第二章 关系数据库
  3. Unity3D之UGUI基础3:Image图片
  4. 2017广东工业大学程序设计竞赛决赛:G. 等凹数字(数位DP)
  5. Ubuntu中需要安装的
  6. 1180魔方阵(每日学习)宁波大学OJ
  7. [转] 面向对象编程 - 继承和多态
  8. Linux在终端搜索的两条命令
  9. 瞎扯系列:判断NPN及PNP管型之右手定则
  10. linux怎么修改内存缓存,Linux内存、缓存、Swap等修改