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. Windows搭建python开发环境,python入门到精通[一]

    从大学开始玩python到现在参加工作,已经有5年了,现在的公司是一家.net的公司用到python的比较少,最近公司有新项目需要用到python,领导希望我来跟其他同事training,就有了这篇博 ...

  2. 【转】RHadoop实践系列之一:Hadoop环境搭建

    RHadoop实践系列之一:Hadoop环境搭建 RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析.Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来 ...

  3. Android 解读.apk解压后文件详细说明

    转自:http://xdang.org/post-602.html 以下原文: 反编译 — 在apk文件中能得到什么 最近在做android客户端与服务器安全通信,有一种常见的不安全因素:很多软件常常 ...

  4. PowerShell命令卸载Win10内置应用

    Windows10系统预装了大批的应用,开始菜单右侧的磁贴即显示了其中的大部分,包括:人脉.日历.邮件.资讯.Xbox.Groove音乐.Camera相机.电影和电视.照片.手机助手.天气.OneNo ...

  5. windows下 MySQL手动安装与卸载

    下载文件以后进行解压 ,指定文件的具体位置 1.安装 选择路径下的mysqld --intall 指定服务名称  --设置配置文件 例子: C:\Users\Administrator\Desktop ...

  6. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...

  7. 彻底解决mysql中文乱码的办法,修改mysql解压缩版(免安装版或zip版)字符编码

    MySQL会出现中文乱码的原因不外乎下列几点:1.server本身设定问题,例如server字符编码还停留在latin12.table的语系设定问题(包含character与collation)3.客 ...

  8. vlan协议及端口类型

    一.VLAN协议 1.协议的应用 802.1Q协议,即Virtual Bridged Local Area Networks协议,主要规定了VLAN的实现. 2.协议结构 每一个支持802.1Q协议的 ...

  9. stanford coursera 机器学习编程作业 exercise 3(使用神经网络 识别手写的阿拉伯数字(0-9))

    本作业使用神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于使用逻辑回归实现多分类问题:识别手写的阿拉伯数字(0-9),请参考:http://www.cnblogs.com ...

  10. VIJOS1240 朴素的网络游戏[DP]

    描述 佳佳最近又迷上了某款类似于虚拟人生的网络游戏.在游戏中,佳佳是某旅行团的团长,他需要安排客户住进旅馆.旅馆给了佳佳的旅行团一个房间数的限制.每一个房间有不同的容纳人数和价钱(这个价格是房间的总价 ...