C# EF框架 频繁连接性能损耗
目的
测试EF框架在一次连接中多次保存和多次连接的耗时对比
测试环境
- 数据库SqlServer 2012 R2
- EF框架6.2.0版本
数据库内容
ID | UserName | Password | CreateTime |
---|---|---|---|
1 | 111 | 123 | 2019-07-17 12:12:12 |
2 | 222 | 123 | 2019-07-17 12:12:12 |
代码
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFConnectTest
{
class Program
{
static void Main(string[] args)
{
for(int i=1; i<=10; i++)
{
var task1 = Task.Factory.StartNew<long>(Connect1);
task1.Wait();
Console.WriteLine(string.Format("第{0}次测试,连接一次的情况下耗时{1}ms", i, task1.Result));
var task2 = Task.Factory.StartNew<long>(Connect2);
task2.Wait();
Console.WriteLine(string.Format("第{0}次测试,连接多次的情况下耗时{1}ms", i, task2.Result));
Console.WriteLine(string.Format("平均每次连接多耗时{0}ms{1}", (double)(task2.Result - task1.Result) / Count, Environment.NewLine));
}
Console.ReadLine();
}
/// <summary>
/// 执行次数
/// </summary>
private static int Count = 1000;
public static long Connect1()
{
Stopwatch sw = new Stopwatch();
sw.Restart();
using (TestEntities dbContext = new TestEntities())
{
var i = 0;
while (i < Count)
{
var userList = dbContext.User.ToList();
foreach (var user in userList)
{
user.UserName = i.ToString();
}
i++;
dbContext.SaveChanges();
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
public static long Connect2()
{
Stopwatch sw = new Stopwatch();
sw.Restart();
var i = 0;
while (i < 1000)
{
using (TestEntities dbContext = new TestEntities())
{
var userList = dbContext.User.ToList();
foreach (var user in userList)
{
user.UserName = i.ToString();
}
i++;
dbContext.SaveChanges();
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
}
}
测试结果
第1次测试,连接一次的情况下耗时7150ms
第1次测试,连接多次的情况下耗时4912ms
平均每次连接多耗时-2.238ms
第2次测试,连接一次的情况下耗时4518ms
第2次测试,连接多次的情况下耗时5217ms
平均每次连接多耗时0.699ms
第3次测试,连接一次的情况下耗时4548ms
第3次测试,连接多次的情况下耗时5719ms
平均每次连接多耗时1.171ms
第4次测试,连接一次的情况下耗时4137ms
第4次测试,连接多次的情况下耗时5456ms
平均每次连接多耗时1.319ms
第5次测试,连接一次的情况下耗时4136ms
第5次测试,连接多次的情况下耗时5771ms
平均每次连接多耗时1.635ms
第6次测试,连接一次的情况下耗时4237ms
第6次测试,连接多次的情况下耗时5570ms
平均每次连接多耗时1.333ms
第7次测试,连接一次的情况下耗时4233ms
第7次测试,连接多次的情况下耗时5109ms
平均每次连接多耗时0.876ms
第8次测试,连接一次的情况下耗时4746ms
第8次测试,连接多次的情况下耗时5132ms
平均每次连接多耗时0.386ms
第9次测试,连接一次的情况下耗时4797ms
第9次测试,连接多次的情况下耗时5033ms
平均每次连接多耗时0.236ms
第10次测试,连接一次的情况下耗时4342ms
第10次测试,连接多次的情况下耗时5209ms
平均每次连接多耗时0.867ms
结果分析
第一次测试由于首次连接数据库结果不准,使用其他9组测试数据进行耗时分析
每次连接的多耗时0.937ms
C# EF框架 频繁连接性能损耗的更多相关文章
- C# 的EF框架怎么连接Oracle数据库
安装odp.net ODP.NET你不需要安装Oracle,不需要配置oracle.key文件,不需要配置TnsNames.Ora文件 不需要配置环境变量:完全的傻瓜式的在没有安装oracle数据库或 ...
- 实体框架 (EF) 入门 => 六、性能注意事项
这个还真是复杂,看了看微软的文档,有些根本就看不懂,有些能看懂,但对我这种菜鸟也不会去用. 无从下手啊,前面放了几个链接,挨个试试吧. 一.显式打开连接 这个我测试过,有些时候,需要我们显示打开连接, ...
- Redis高级实践之————Redis短连接性能优化
摘要: 对于Redis服务,通常我们推荐用户使用长连接来访问Redis,但是由于某些用户在连接池失效的时候还是会建立大量的短连接或者用户由于客户端限制还是只能使用短连接来访问Redis,而原生的Red ...
- EF框架的三种工作方式
EF框架step by step(1)—Database-First EF框架step by step(2)—Model-First EF框架step by step(3)—Code-First 通过 ...
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- EF框架之三种模式
使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...
随机推荐
- Loadrunner查询博客列表并循环删除博客列表中的所有博客
Loadrunner查询博客列表并循环删除博客列表中的所有博客,在博客列表请求中使用关联,获取出列表中博客的数量,并找出博客列表请求的必要参数.关联使用Ordinal=All 找出所有匹配值 查找出所 ...
- SpringMVC request 得到文件路径
1.java中的路径 File directory = new File("abc"); // 对于getCanonicalPath()函数,“."就表示当前的文件夹,而 ...
- Qt组件(例如按钮、树形控件)上响应鼠标右键
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->textEdit,SIGNAL(cust ...
- (转载)极大似然估计&最大后验概率估计
前言 不知看过多少次极大似然估计与最大后验概率估计的区别,但还是傻傻分不清楚.或是当时道行太浅,或是当时积累不够. 这次重游机器学习之路,看到李航老师<统计学习方法>中第一章关于经验风险最 ...
- 读Secrets of the JavaScript Ninja(一)函数
理解JavaScript为什么应该作为函数式 在JavaScript中,函数是程序执行过程中的主要模块单元 函数是第一类对象 通过字面量创建 function ninjaFunction(){} 赋值 ...
- Intellij IDEA设置类注释和方法注释
背景:工欲善其事必先利其器,如果不能把工具用熟练了, 感觉很是别扭. 参考:IntelliJ IDEA设置类注释和方法注释 IntelliJ IDEA 中创建类的时候,可以直接自动给类加注释的设置,以 ...
- dell服务器在bios中指定raid5的热备盘
一.创建raid5 二.指定热备盘 选择第15块磁盘作为上面创建的raid5的热备盘 选中 选中我们刚创建的raid5,点击OK
- 总结一些Java试题
1.方法重载和重写的区别: 重载是在同一个类中,同名不同参 重写是在不同类中,同名同参 2.抽象类的特点: 抽象方法和抽象类都要被关键词abstract修饰 抽象方法一定在抽象类中 抽象类不能new对 ...
- java + selenium + testng实现简单的UI自动化
新建Maven项目,添加需要的依赖 1.新建一个Maven项目 2.在pom.xml中添加需要的依赖,这里只要selenium和testng就行 <!-- https://mvnreposito ...
- java中的内存分配问题
class A{ int i; int j; } clsaa demo{ public static void main(String[] args){ A aa = new A(); A aa; / ...