简单测试lambda和linq查找的性能
在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方法。
这个方法的实现代码
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查找的性能相关推荐
- INNODB在裸设备上的性能简单测试
INNODB在裸设备上的性能简单测试 裸设备简单测试 2009年4月28日 我这里用的SUN VBOX以及SUPER-SMACK来得到的数据. 至于SUPER-SMACK的介绍参见我以前的文章 ...
- android ORM框架的性能简单测试(androrm vs ormlite)
2019独角兽企业重金招聘Python工程师标准>>> 前言 看了一下现在的android设备,性能都不差,就懒得直接用sqlite,直接上ORM框架把,上网搜了一圈,觉得andro ...
- MySQL中MyISAM引擎与InnoDB引擎性能简单测试[转]
MySQL中MyISAM引擎与InnoDB引擎性能简单测试 [硬件配置] CPU : AMD2500+ (1.8G) 内存: 1G/现代 硬盘: 80G/IDE [软件配置] OS : Windows ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- JMeter测试TCP/IP Socket应用的性能
摘要 本文描述了如何利用JMeter来测试TCP/IP Socket应用的性能.文章先对Socket作了一点简单介绍,然后提供并解释了两个样例Socket应用,最后介绍如何利用JMeter来对它们进行 ...
- 二分查找树性能分析(Binary Search Tree Performance Analysis)
经典算法系(21)-二分查找树性能分析(Binary Search Tree Performance Analysis)https://www.douban.com/note/221942390/ ...
- C#switch语句简单测试
switch的简单测试..... 代码: using System; using System.Collections.Generic; using System.Linq; using System ...
- Java 8:测试Lambda水
Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression . 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9.但是,将lambda表达式(或闭包 ...
- 第十二节:Lambda、linq、SQL的相爱相杀(1)
一. 谈情怀 Lambda.Linq.SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用. 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学 ...
最新文章
- oracle过滤某个字段重复记录,只获取一条记录
- Angular 项目 ng serve 背后发生的事情
- 设置仿真器H-JTAG ARM仿真器和MDK 联调设置
- java对象复制 忽略空值_优秀!高级Java都这样优雅处理空值
- python高效办公 知乎_骚操作|高效办公,Python自动化教你一键获取日志!
- 2021SC@SDUSC——使用CUDA/GPU技术加速密码运算(一)
- EXPRESS语言与IFC体系
- mimics软件临床应用.计算机辅助外科入门技术,Mimics软件临床应用 计算机辅助外科入门技术.pdf...
- 数据分析师,数据挖掘工程师和数据研发工程师有什么区别?
- 数据中心设计方案 实例,数据中心网络设计方案
- 易基因 | 文献速递:重亚硫酸盐扩增子测序研究通过DNA甲基化监测急性髓系白血病MRD
- python超清壁纸_python爬虫 爬取超清壁纸代码实例
- UE4 后处理材质 镜头光晕(Lensflare)效果
- C语言作业-小学生测验
- matlab三个简单物理建模实例(笔记)
- AMD处理器下虚拟机VMware15安装macOS 10.14
- 记录VS2015编译cuda11+opencv库遇到的问题
- 华为主题 主题兑换券活动高端操作
- 小米4c刷机包Linux,MIUI【双开应用】数据备份(android通用,分身数据)
- 原生js实现的金山打字小游戏