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的性能的更多相关文章

  1. C#实用杂记-EF全性能优化技巧

    原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG   ...

  2. EF的性能改善和思考

    EF是个工具,用的好了性能就会很好,用的不好性能就会有很大损失. 先从EF的设计思想来讲解 EF的初衷是根据缓存中的实体对象,以及实体对象的状态(删除.更新.添加)来对数据库进行操作,这些实体对象.以 ...

  3. 第八节: EF的性能篇(一) 之 EF自有方法的性能测试

    一. 开发中常见的性能问题 我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题. 1. 真假分页 ① 假分页: db.xxx.toLi ...

  4. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

  5. MVC教程--MiniProfiler.EF监控调试MVC和EF的性能

    上一篇谈到mvc中ef输出执行sql日志:来谈用mvc开发项目的调试和性能监控.EF框架自动给我生成sql语句,当我们的程序遇到性能问题的时候我们可以用MiniProfiler.EF来监控调试MVC和 ...

  6. EF提高性能

    实体框架 5 性能注意事项 作者:David Obando.Eric Dettinger 等 发布时间:2012 年 4 月 1.简介 对象关系映射框架是一种在面向对象的应用程序中提供数据访问抽象的便 ...

  7. C#中 EF(EntityFramework) 性能优化

    现在工作中很少使用原生的sql了,大多数的时候都在使用EF.刚开始的时候,只是在注重功能的实现,最近一段时间在做服务端接口开发.开发的时候也是像之前一样,键盘噼里啪啦的一顿敲,接口秒秒钟上线,但是到联 ...

  8. 优化EF的性能

    Entity Framework的性能优化: 1.使用MergeOption.NoTracking  (发现添加这个代码后, 导致"The object cannot be deleted ...

  9. EF core 性能调优

    Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...

随机推荐

  1. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

  2. js实现页面跳转的几种方式

    第一种:    <script language="javascript" type="text/javascript">           wi ...

  3. mysql自动备份维护shell脚本 (copy)

    #!/bin/bash #Mysql 自动备份 压缩并上传到 指定ftp #设想每天凌晨3点备份mysql #编辑crontab配置文件 # * * * backupmysql.sh #压缩并以&qu ...

  4. Linux系统监控命令之iotop

    iotop命令 iotop命令是一个用来监视磁盘I/O使用状况的top类工具.iotop具有与top相似的UI,其中包括PID.用户.I/O.进程等相关信息.Linux下的IO统计工具如iostat, ...

  5. 初识JNI

    需要用到NDK Android 平台从诞生起,就已经支持 C.C++开发.众所周知,Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使 ...

  6. 地图编辑器V3

    V3.2.4 (2014-07-03) ---------------------------1. 保存地图的锁定与可视状态:2. 地图单独存为map格式结尾的文件与导出的XML文件区别:3. 修正瓷 ...

  7. 蜕变·WebRebuild 2013 前端年度交流会邀请

    联网web前端设计行业通过一段时期的茧封或焰炼,web技术使行业.企业及自身发生质的改变.痛苦的蜕变是成长的契机,在彼此互相冲击.交流.融合的对话下,将以尊重包容互助合作同步发展的心态,对行业蜕变.自 ...

  8. 应用程序Cache对象到高性能Memcached学习之路

    来源:微信公众号CodeL 以下是个人学习之路的简单分享,不足之处欢迎大神们批评指正! 在网站开发的初期,我们没有考虑更多的东西,也没有对缓存进行系统的设计,而是直接使用了应用程序缓存对象Cache, ...

  9. NOIP2012pj摆花[DP 多重背包方案数]

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  10. AC日记——数字统计 openjudge 1.5 41

    41:数字统计 总时间限制:  1000ms 内存限制:  65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...