你是否还在质疑EF的性能
1. 写在前面的话
一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是对自己所掌握的技能融会贯通灵活运用的体现,所以接下来打算利用一些业余时间写写博客,博客中某些观点和见解纯属个人经验和见解,可能不对,或者不够准确,还请大家多多指导,如果您能指出我不对的地方我一定非常感谢您,我会不断改进。不断向您请教学习。
2. 切入正题
EF全称Entity Framework,大家都只EF是微软原生的ORM框架,但一直以来不是很受欢迎,具体原因不详,但是凭个人经验和周围同行的呼声大致可以得知,一个非常重要的原因就是很多人质疑EF的性能,认为面对大数据量的增删改查时,EF的性能是一个非常重要的瓶颈,在EF5及其以前版本的确如此,但是经过微软不断的优化重构,以及某些爱心人士和权威机构的扩展,微软推出的EF6以及某些爱心人士和权威机构推出的EF的一些扩展,使得EF的性能得到大大改善,本文不是讲一些概念性的东西,也不是去讲太深层次的原理机制等,本文主要介绍EF6及其相关扩展与主流ORM 框架Dappe的性能对比。
3. 环境配置
1.电脑配置
2.软件环境
Vs2013 update 4,SQL Server 2014, EntityFramework 6.1.3,
4. 测试情况
本文重点是测试EF的性能,所以也不用具体去讨论使用场景,具体场景大家具体选择就可以了,本文考虑最理想的情况下测试,对EF中影响增删改查的效率的因素全部排出,即:对EF的上下文做一些配置以减少性能的损耗:
Configuration.AutoDetectChangesEnabled = false;
Configuration.ValidateOnSaveEnabled = false;
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
具体含义根据英文名称就可以知道,这里不用做过多的解释,废话不多说,直接看结果。
5. 批量数据插入测试性能测试对比
6. 批量数据更新测试性能对比
7. 批量数据删除测试性能对比
8. 查询测试性能对比
9. 测试结论
本文所用数据库比较大,不方便上传,所以上传到群共享,大家可以到群共享下载测试。
测试都是从一个库取出数据插入另一个库,然后在新的库中做操作,而且在增删改之前都要对新库中的数据做清除,所以批量插入数据或者批量更新数据实际上是做了清除数据,取数据,插入数据三个步骤,实际环境中清除数据,取数据属于操作前准备,所产生的性能损耗应该另外计算,所以实际环境增删改应该会更快。
另外曾经在做ADO.NET封装的时候测试过对于批量插入数据,采用分组提交事务的将分组平衡点(一次插入的条数)设置为500时,效率最高,而本文中采用dapper批量插入数据,不管插入多少条,我都一次性插入,不清楚dapper内部有没有做分组提交封装,没有研究过内部实现,所以,实际应用中如果对dapper也做分组提交事务的话,性能可能还会有很大的提高。
从测试的速度上来看:对于插入数据,从清除数据,再取数据,插入到表中三步操作EF6扩展的批量操作比dapper快4倍左右;而对于批量删除和更新,也是先清除表中的数据再从一个大表中取数据插入新表中进行删除和更新测试,当然不管是EF还是dapper前批量操作的前两个步骤(清除数据,再取数据插入到表中)都是用同样的方法执行,而且速度非常快,对批量删除和批量更新的影响相同,所以对于批量删除和更新相当于给EF和dapper同时加上一个非常小的时间,对测试结果不会有太大的影响,测试结果也是EF6扩展的批量删除和更新操作比dapper快4倍左右,当然也有可能dapper方法没有用对,所以才导致dapper性能比EF6扩展的还要低。
对于查询,本文都是针对同一张表,表中的测试数据有76万左右数据,同时采用了默认EF查询,EF AsNoTracking无跟踪查询,dapper查询和各种形式的DataReader查询,经过多次的测试都是DataReader最快,EF6 No Track,DataReader for Expression Mapping,Dapper三者随机排名,旗鼓相当,不分伯仲。
10. 注意:
AsNoTracking是无跟踪查询, 有时我们的实体只需要显示,无需更新,所以为了提高性能,我们不需要实体被EF追踪。此时可以使用AsNoTracking的查询来得到实体,这样实体的状态是Detached状态。这样可以提高性能,但是如果取到数据后,要对数据做修改并保存,则无法反映到数据库里。另外如果对通过AsNoTracking,得到的数据做删除处理,还会报错。
你是否还在质疑EF的性能的更多相关文章
- C#实用杂记-EF全性能优化技巧
原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG ...
- EF的性能改善和思考
EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...
- 第八节: EF的性能篇(一) 之 EF自有方法的性能测试
一. 开发中常见的性能问题 我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题. 1. 真假分页 ① 假分页: db.xxx.toLi ...
- 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题
一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...
- MVC教程--MiniProfiler.EF监控调试MVC和EF的性能
上一篇谈到mvc中ef输出执行sql日志:来谈用mvc开发项目的调试和性能监控.EF框架自动给我生成sql语句,当我们的程序遇到性能问题的时候我们可以用MiniProfiler.EF来监控调试MVC和 ...
- EF提高性能
实体框架 5 性能注意事项 作者:David Obando.Eric Dettinger 等 发布时间:2012 年 4 月 1.简介 对象关系映射框架是一种在面向对象的应用程序中提供数据访问抽象的便 ...
- C#中 EF(EntityFramework) 性能优化
现在工作中很少使用原生的sql了,大多数的时候都在使用EF.刚开始的时候,只是在注重功能的实现,最近一段时间在做服务端接口开发.开发的时候也是像之前一样,键盘噼里啪啦的一顿敲,接口秒秒钟上线,但是到联 ...
- 优化EF的性能
Entity Framework的性能优化: 1.使用MergeOption.NoTracking (发现添加这个代码后, 导致"The object cannot be deleted ...
- EF core 性能调优
Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...
随机推荐
- JS代码判断字符串中有多少汉字
$("form").submit(function () { var content = editor.getContentTxt(); var sum = 0; re = /[\ ...
- Oracle表字段的增加、删除、修改和重命名
本文主要是关于Oracle数据库表中字段的增加.删除.修改和重命名的操作. 增加字段语法:alter table tablename add (column datatype [default val ...
- linux添加开机自启动脚本示例详解
linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有 ...
- ELK Nxlog->Kafka->ElasticSearch
Windows 系统下,log4日志通过kafka发送到elasticsearch; windows 下nxlog没有找到直接发送数据到kafka的插件,所以采用logstash中转下 Nxl ...
- android setLayoutParams 问题,出错
LinearLayout layt = (LinearLayout) rootView.findViewById(R.id.llt_2); FrameLayout.LayoutParams layou ...
- 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp
洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...
- margin-top无效的解决方法
先上代码: <div id="content" style=" width:750px; height:300px; background:#C29A29; mar ...
- python paramiko
paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令. 项目地址:https://github.com/paramik ...
- html5新增及废除属性
html5中,在新增加和废除很多元素的同时,也增加和废除了很多属性. 一.新增属性 1.表单属性 a.autofocus 对input[所有类型].select.textarea与button指定au ...
- 学习shell中遇到的一些基础问题总结
今天入门Shell脚本编程:今天的目标是完成冒泡排序,遇到了很多问题,总结了一下: 我从c转到shell遇到了这样的一些情况: 1:首先这几个符号非常重要 $变量:把变量的值拿出来使用(所以赋值语句应 ...