你是否还在质疑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 ...
随机推荐
- Activiti之 Exclusive Gateway
一.Exclusive Gateway Exclusive Gateway(也称为XOR网关或更多技术基于数据的排他网关)经常用做决定流程的流转方向.当流程到达该网关的时候,所有的流出序列流到按照已定 ...
- x01.os.15: 看上去很美
张碧晨在韩国学的不是技巧,而是基本功:气息!声音由气息托着,似真声而不是真声,似假声又不是假声,所以才能在动听的地方唱得更动听.编程也是一样,基本功很重要:内存!所谓的黑客高手,攻击的一大手段,便是利 ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- C# FTP 命令无法获取ServerU目录列表问题
第一步: 使用C# 的Ftp功能时,发现了一个很奇怪的现象,获取目录列表的命令,在SeverU上面直接返回错误,而在windows自带的FTP上则正常,经过反复试验,终于发现,原来是ServerU默 ...
- Windows Azure Backup Agent安装注意事项
在Windows Server 2008 R2 SP1上安装Windows Azure Backup Agent时会出现错误: “Unable to execute the embedded appl ...
- Java:JSTL遍历数组,List,Set,Map
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- C#基础---扩展方法的应用
最近对扩展方法比较感兴趣,就看了看资料,记录一下扩展方法的几种方法. 一. 扩展方法的基本使用: Note: 1. 扩展方法必须在静态类中, 2 扩展方法必须声明静态方法,3 扩展方法里面不能调用其 ...
- 怎样在ZBrush中快速绘制人体躯干
之前我们对人体骨点的雕刻,了解了人体骨骼比例结构特征.今天的ZBrush教程将通过ZBrush®遮罩显示的特点对模型的人体躯干进行细致雕刻.文章内容仅以fisker老师讲述为例,您也可以按照自己的想法 ...
- Y2161 Hibernate第三次考试 2016年8月18日 试卷分析