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

一. 开发中常见的性能问题

   我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题。

1. 真假分页

  ① 假分页: db.xxx.toList().Skip(2).take(4) 。

   ② 真分页:db.xxx.Skip(2).take(3).toList() 。

2. 合理的使用EF的数据加载方式

   EF的加载方式有:立即加载、延迟加载、显示加载。

  详见:

    ①: 第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)

    ②: 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)。

 

3. NoTracking的使用

   EF查询出来的实体,默认是跟踪状态的,如果查询出来的实体不需要修改或者删除,查询的时候可以删除状态跟踪,变为Detached状态,来提高性能。

    关于EF状态的跟踪,详见后面章节,敬请期待!!

1     using (DbContext context = new MyDbContext())
2     { 
3          var people = context.Student.Where(p => p.Id > 2).AsNoTracking().ToList();
4     }

4. 合理的使用SQL事务

  将与事务无关的一些SQL语句放到事务外,如果一个事务中的SQL语句过长,很容易出现死锁问题,压力测试时,出现资源被锁的错误。

 

二. 关于EF数据操作的性能问题

   EF自诞生以来,大批量的操作增加、删除、修改操作数据效率一直很低,1000条数据以内,效率尚且可以接受(10s内),但随着数据量逐渐增大,很容易在执行的过程中就宕机了,相当尴尬。在本章节,我们一起来测试一下,EF在不进行任何优化的情况下,几种写法的效率问题。

  我们这里的测试是以增加数据为例,先把测试的三种写法的结论贴上。

1. 每添加1条数据,savechange一下(小白常犯的错误,坚决抵制这种做法!!)

复制代码

 1      private static void NewMethod1(DbContext db)2         {3             Console.WriteLine("-------------1. 每添加1条数据,savechange一下(小白常犯的错误,坚决抵制这种做法!!)-------------------");4             Stopwatch watch = Stopwatch.StartNew();5             for (int i = 0; i < 1000; i++)6             {7                 TestOne t = new TestOne();8                 t.id = Guid.NewGuid().ToString("N");9                 t.t1 = "t1+" + i;
10                 t.t1 = "t2+" + i;
11                 db.Set<TestOne>().Add(t);
12                 db.SaveChanges();
13             }
14             watch.Stop();
15             Console.WriteLine("1000条数据耗时:{0}", watch.ElapsedMilliseconds);
16         }

复制代码

2. 先将所有数据添加到内存里,最后再savechange

复制代码

 1  private static void NewMethod2(DbContext db, int count)2         {3             Console.WriteLine("-------------2. 先将所有数据添加到内存里,最后再savechange-------------------");4             Stopwatch watch = Stopwatch.StartNew();5             for (int i = 0; i < count; i++)6             {7                 TestOne t = new TestOne();8                 t.id = Guid.NewGuid().ToString("N");9                 t.t1 = "t1+" + i;
10                 t.t1 = "t2+" + i;
11                 db.Set<TestOne>().Add(t);
12             }
13             db.SaveChanges();
14             watch.Stop();
15             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
16         }

复制代码

3. 使用addRange方法,先将数据加到list集合中,然后一次性通过addRange加到内存里

复制代码

 1      private static void NewMethod3(DbContext db, int count)2         {3             Console.WriteLine("-------------3. 使用addRange方法,先将数据加到list集合中,然后一次性通过addRange加到内存里-------------------");4             Stopwatch watch = Stopwatch.StartNew();5             List<TestOne> tList = new List<TestOne>();6             for (int i = 0; i < count; i++)7             {8                 TestOne t = new TestOne();9                 t.id = Guid.NewGuid().ToString("N");
10                 t.t1 = "t1+" + i;
11                 t.t1 = "t2+" + i;
12                 tList.Add(t);
13             }
14             db.Set<TestOne>().AddRange(tList);
15             db.SaveChanges();
16             watch.Stop();
17             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
18         }

复制代码

 

   总结:EF自有的方法,三个阶段如上,数据超过1000条,性能直线下降,那么怎么来解决EF处理大数据量的性能问题呢?敬请期待下一个章节:   第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 中将文件设置密码,linux – 如何使用公钥在openssl中加密大文件

如何使用公钥加密大文件&#xff0c;以便没有人除了拥有私钥的人能够解密&#xff1f;我可以使RSA公钥和私钥&#xff0c;但当涉及到使用此命令加密大文件&#xff1a;openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml和…

如何查看自己linux版本,如何查看Linux操作系统版本?

1. 查看内核版本命令$ cat /proc/versionLinux version 2.6.32-358.el6.x86_64 (mockbuildc6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013$ uname -aLinux 192.168.1.10 2.6.32-358.el6.x86_64 #1 SMP…

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

一. 综述 该模块主要介绍&#xff1a;EF的性能优化插件Z.EntityFramework.Extensions&#xff0c;该插件收费。 (一). 简介 1. 相关网站&#xff1a;http://www.zzzprojects.com/ 2. 下载途径&#xff1a;通过Nuget直接下载或者去官网下载(要注意更新最新版本&#xff0c;可…

linux ssh非交互脚本,sshpass实现shell脚本非交互密码验证

1、sshpass的简介OpenSSH 自带的 ssh 客户端程序&#xff0c;默认不允许以非交互的方式传递密码&#xff0c;所以需要远程登录服务器进行批处理就无法进行。sshpass 的出现&#xff0c;解决了这一问题。它允许你用 -p 参数指定明文密码&#xff0c;然后直接登录远程服务器。2、…

第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)

一. 简介 我们在前面章节介绍EF基本增删改的时候&#xff0c;曾说过EF的SaveChanges()方法&#xff0c;会一次性的将所有的实体的状态变化统一提交到数据库&#xff0c;那么你是否想过EF的实体会有哪些状态变化呢&#xff1f;什么原因会导致其变化呢&#xff1f;我们怎么来追踪…

mathematica在linux上运行,Mathematica在Ubuntu中的表现及修正

Mathematica在Ubuntu中的表现及修正发布时间:2008-03-11 16:13:58来源:红联作者:verytow在Ubuntu-feisy中&#xff0c;使用Mathematica有一段时间了&#xff0c;由于Linux系统内存管理机制的优越性(具体的&#xff0c;我得去查资料&#xff0c;只是据说&#xff1b;用于计算大型…

第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)

一. 简介 EF连接数据库有三种模式&#xff0c;分别是DBFirst、ModelFirst、CodeFirst&#xff0c;分别适用于不同的开发场景。 该章节&#xff0c;将主要介绍EF的DBFirst连接SQLServer数据库和MySql数据库两种操作方式 该模式在EF中出现的出现的最早&#xff0c;符合我们的传统…

linux禁止u盘自动运行,求设置U盘自动运行和禁止运行的方法。

方法一&#xff1a;这种方法比较简单&#xff0c;就是用户在放入U盘同时&#xff0c;按住Shift键直至U盘的指示灯熄灭&#xff0c;然后松开Shift键即可。这种方法是一种临时应急法&#xff0c;如果拥护之是偶尔项禁止自动播放功能&#xff0c;这种方法比较合适。方法二&#xf…

第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例)

一. 简介 顾名思义&#xff0c;ModelFirst是模型优先&#xff0c;是DBFirst的逆向模式&#xff0c;先建立实体数据模型&#xff0c;然后根据实体数据模型来生成数据库&#xff0c;从而驱动整个开发流程.&#xff08;生成一个空的edmx文件&#xff0c;手动在里面建立实体模型&am…

linux 查看zookeepr所在路径,Linux系统:Centos7下搭建ZooKeeper3.4中间件,常用命令总结...

本文源码&#xff1a;[GitHub点这里](https://github.com/cicadasmile/linux-system-base) || [GitEE点这里](https://gitee.com/cicadasmile/linux-system-base)# 一、下载解压##1、Zookeeper简介Zookeeper 作为一个分布式的服务框架&#xff0c;主要用来解决分布式集群中应用…

第十三节: EF的三种模式(三) 之 来自数据库的CodeFirst模式

一. 简介 【来自数据库的Code First模式】实质上并不是CodeFirst模式&#xff0c;而是DBFirst模式的轻量级版本&#xff0c;在该模式中取消了edmx模型和T4模板&#xff0c;直接生成了EF上下文和相应的类&#xff0c;该模式出现在VS2015版本以后。 该模式也是适用于数据库已经设…

第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定

一. 简介 1. 正宗的CodeFirst模式是不含有edmx模型&#xff0c;需要手动创建实体、创建EF上下文&#xff0c;然后生成通过代码来自动映射生成数据库。 2. 旨在&#xff1a;忘记SQL、忘记数据库。 3. 三类配置&#xff1a;One To One(one-to-zero-or-one)、One To Many、Many To…

查看linux硬核上的线程,给大家分享一点基础硬核知识哦 Linux的基础指令操作Lin...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼给大家分享一点基础硬核知识哦Linux的基础指令操作Linux的基础指令操作Linux的指令下达方式很简单&#xff0c;只需要记得几个重要的概念就可以l: command&#xff1a;指令&#xff0c;一行指令中第一个输入的部分绝对是指令2&…

第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

一. 简介 1. DataAnnotations说明&#xff1a;EF提供以特性的方式添加到 domain classes上,其中包括两类&#xff1a; A&#xff1a;System.ComponentModel.DataAnnotations命名空间下的特性是表中列的属性的。 包括&#xff1a;Key、Required、MinLength和MaxLength、StringL…

linux 性能测试iostat,Linux性能分析之二(iostat)

前言在之前的博客中我们详细的说明了性能瓶颈的解决思路&#xff0c;也详细介绍了Vmstat的使用&#xff0c;今天我们就详细说说磁盘IO的那些事&#xff0c;磁盘IO是我们最常遇到的瓶颈&#xff0c;下面我们根据iostat详细聊聊磁盘IO一、磁盘IO性能指标1.1、每秒IO数(tps)对于磁…

第十六节: EF的CodeFirst模式通过Fluent API修改默认协定

一. 简介 1. 优先级&#xff1a;Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnModelCreating这个重写方法中进行 3. 常见的配置&#xff1a; ① 获取表对应的配置根&#xff1a; var stu modelBuilder.Entity<XXX>(); ②…

安卓手机挂载Linux,android 挂载NFS教程

0&#xff0c;在Ubuntu新建nfs目录:#mkdir /home/shuimu/arm_project/rootfs将FORLINX_6410_yaffs2_v1.0.tgz复制到rootfs中&#xff0c;解压当前文件夹#tar–zxf FORLINX_6410_yaffs2_v1.0.tgz1.烧写mmc&#xff0c;uboot&#xff0c;zImage到开发板。2&#xff0c;在ubuntu上…

linux apache jk,Linux下Apache+Tomcat+JK实现负载均衡和群集的完整过程

感谢chaijunkun的精彩大作&#xff0c;真的辛苦了。最近在开发的项目需要承受很高的并发量。综合各种情况&#xff0c;决定使用ApacheTomcatJK的方式实现负载均衡&#xff0c;并且作为一个统一的服务还要实现群集(同步Session)。在网上找了很多资料&#xff0c;都是零零散散的&…

第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略&#xff1a; 1. CreateDatabaseIfNotExists&#xff1a;EF的默认策略&#xff0c;数据库不存在,生成数据库&#xff1b;一旦model发生变化,抛异常&#xff0c;提示走数据迁移 2. DropCreateDatabaseIfModelCha…

linux笔记本不关机直接合上,笔记本电脑不关机直接合上行吗

可以。笔记本电脑将盖子合住&#xff0c;对电脑是没有损害&#xff0c;系统的默认设置是合上盖子后电脑处于待机状态。这时电脑的大部分硬件都已经关闭&#xff0c;只有个别硬件为了唤醒计算机仍在运行&#xff0c;但都是低功耗&#xff0c;不浪费电&#xff0c;也不会加快计算…