LinQ to SQL 及 non-LinQ方式实现Group的Performance对比
拥有476550数据的一张数据表。使用其中的某个字段分组,然后按该字段进行排序。该需求分别使用LinQ to SQL和non-LinQ的方式实现,然后来看一下performance对比。
LinQ way
from p in context.Part_Part
group p by p.FunctionGroup into groupedPs
orderby groupedPs.Key
select groupedPs
LinQ way for group
non-LinQ way
var results = new SortedDictionary<long?, IList<Part_Part>>();
foreach (var p in context.Part_Part)
{
IList<Part_Part> groupedValue = null; if (!results.TryGetValue(p.FunctionGroup, out groupedValue))
{
groupedValue = new List<Part_Part>();
results[p.FunctionGroup] = groupedValue;
} groupedValue.Add(p);
}
non-LinQ way for group
从
var results = new SortedDictionary<long?, IList<Part_Part>>();
可以看出,用来排序的字段类型为long?。先看一下执行时间。
| LinQ Way | non-LinQ Way | |
| first time | 1:6.698 | 6.707 |
| second time | 1:7.404 | 1.426 |
| third time | 1:7.127 | 1.486 |
| forth time | 1:6.952 | 1.425 |
明显可以看出在这个scenario下,LinQ的performance极低。调整代码,这次使用类型为string的PartDescription分组。测试,结果如下。
| LinQ Way | non-LinQ way | |
| first time | >30min | 8.738 |
| second time | >30min | 4.201 |
| third time | >30min | 4.173 |
| forth time | >30min | 4.176 |
这个scenario下,non-LinQ way耗时有所增加,而LinQ way更是惨不忍睹。甚至在苦苦的等了30分钟不见结果后,提早结束了测试程序。
可见,LinQ在带来简洁风和极佳可读性的同时,也带来了性能的损耗。看一段来自于《LinQ in Action》中,关于LinQ性能问题的描述。
There are no surprises. LINQ does not come for free. LINQ queries cause additional work, object creations, and pressure on the garbage collector. The additional cost of using LINQ can vary a lot depending on the query. It can be as low as 5 percent, but can sometimes be around 500 percent.
既如此,以后还能不能愉快的使用LinQ呢?再来看一段《LinQ in Action》中的描述。
Do not be afraid to use LINQ, but use it wisely. For simple operations that are executed extensively in your code, you may consider using the traditional alternatives. For simple filter or search operations, you can stick to the methods offered by List<T> and arrays, such as FindAll, ForEach, Find, ConvertAll, or TrueForAll. Of course, you can continue to use the classic for and foreach statements wherever LINQ would be overkill. For queries that are not executed several times per second, you can probably use LINQ to Objects safely. A query that is executed only once in a non-time-critical context won't make a big difference if it takes 60 milliseconds to execute instead of 10.
LinQ to SQL 及 non-LinQ方式实现Group的Performance对比的更多相关文章
- Linq to Sql : 三种事务处理方式
原文:Linq to Sql : 三种事务处理方式 Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from MSDN: 事务 (LINQ to SQL)).M ...
- [Silverlight][linq to sql]不能找到linq to sql自动生成类型
最近在做Silverlight项目,结合使用了WCF RIA service,通过linq to sql自动生成model类型,使用起来非常方便.具体可见linq to sql之silverlight ...
- .NET面试题系列[14] - LINQ to SQL与IQueryable
.NET面试题系列目录 名言警句 "理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列." - Jon Skeet LINQ to Obje ...
- LINQ To SQL
议程 1.LINQ To SQL概述 2.LINQ To SQL对象模型 3.LINQ To SQL查询 用到的数据库 SQL Server 2005,数据库名为Test. 两张表,分别为Studen ...
- LINQ to SQL大全
LINQ to SQL语句 (1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的 ...
- [转]LINQ To SQL 语法及实例大全
转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...
- LINQ to SQL语句非常详细(原文来自于网络)
LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...
- linq世界走一走(LINQ TO SQL)
前言:作为linq的一个组件,同时作为ADO.NET的一个组成部分,LINQ TO SQL提供了将关系数据映射为对象的运行时基础结构. LINQ TO SQL是通过将关系数据库对象的数据模型(如一个数 ...
- LINQ To SQL 语法及实例大全
http://blog.csdn.net/pan_junbiao/article/details/7015633 http://blog.csdn.net/pan_junbiao/article/de ...
随机推荐
- mysql启动错误处理
1.当启动MySQL时,报如下错误 [ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' regis ...
- Linux学习笔记——1.超级用户
以超级用户工作:su su命令允许临时变换到任何一用户标识(如果拥有口令的话),并挂起当前shell,为新用户开启一个新的shell. su <user> 将当前用户标识harley变换为 ...
- iOS 清理Xcode项目中没有使用到的图片资源和类文件
接手到一个旧的项目,但是发现里面有太多的无用资源,包括升级app后,一些无用的图片资源并没有被删掉,导致app在打包成ipa包以后,文件变大.手边这个项目IM要更换成环信的IM,之前的一些旧的SDK, ...
- Apache httpd Server Notes
1. httpd启动.停止以及重启 启动: apachectl –f $PATH_TO_CONF/httpd.conf 停止及重启 apachectl –k stop/restart/graceful ...
- Python图像处理:图像腐蚀与图像膨胀
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原 ...
- VxWorks 7 技术简介
VxWorks 7 是新一代的嵌入式实时操作系统,全新的架构设计,灵活化的组件配置,高可靠性与安全性,丰富的第三方软件包,极大的方便用户的开发和使用.本文对VxWorks7 的功能做个简要的记录. V ...
- python小白的初步爬虫
前序: 最近工作不是很忙,领导突然找我谈话,说是谈话,其实就是分配活呗.果不其然,很快进入正题, 给了我一个网址链接,然后说需要商品的信息...巴拉巴拉.好吧,去做吧. 我当时的内心是崩溃的,pyt ...
- 微信小程序登录以及注册用户信息得到token
先来一张登录时序图 总的大概就是 通过调用wx.login得到code 请求small_session获得sessionid 微信wx.getUserInfo获得encryptedData和iv 通过 ...
- C语言链接属性总结
1.什么是链接属性? 当组成一个程序的各个源文件分别被编译后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执行程序. 标识符的链接属性决定如何处理在不同文件中出现的标识符 ...
- Git项目管理
参考 参考书籍 <git学习指南> 参考网站 https://git-scm.com/ Git局限性讨论 高复杂度 两张图看懂集中式版本管理系统和分布式管理系统的区别-集中式vs分布式 g ...