你是否还在质疑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 ...
随机推荐
- Apache安装问题:configure: error: APR not found . Please read the documentation
Linux上安装Apache时,编译出现错误: checking for APR... no configure: error: APR not found . Please read the do ...
- 正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?
解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统总结 ...
- Linux aclocal
一.简介 二.安装 三.常用指令 1)安装m4 aclocal -I m4 2)查看aclocal的路径 aclocal --print-ac-dir 四.常见问题 1) LIBTOOL is und ...
- ubuntu 安装配置jdk+eclipse+android sdk
共5步: 1.安装jdk 2.安装eclipse 3.安装android-sdk 4.安装adb 5.在eclipse中安装ADT 1.安装jdk 之前已经安装好了. 用下面的命令安装,只需一些时间, ...
- [转]六款值得推荐的android(安卓)开源框架简介
本文转自:http://www.jb51.net/article/51052.htm .volley 项目地址 https://github.com/smanikandan14/Volley-demo ...
- 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)
hi 感觉论文开题基本确定了,凯森 1.MySQL -----自定义函数----- ----基本 两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有) 函数体:合法的SQL语句:以 ...
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- 线程同步以及yield()、wait()、Notify()、Notifyall()
一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...
- AC日记——质因数分解 1.5 43
43:质因数分解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 输入只有一行,包含一个正整数 n. 对于60% ...
- cache缓存
缓存分为:数据缓存,页面缓存,内存缓存(memcache,redis) ob,输出缓冲区,是output buffering的简称 FileCache.php <?php //本文件用来存储和读 ...