目的

测试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框架 频繁连接性能损耗的更多相关文章

  1. C# 的EF框架怎么连接Oracle数据库

    安装odp.net ODP.NET你不需要安装Oracle,不需要配置oracle.key文件,不需要配置TnsNames.Ora文件 不需要配置环境变量:完全的傻瓜式的在没有安装oracle数据库或 ...

  2. 实体框架 (EF) 入门 => 六、性能注意事项

    这个还真是复杂,看了看微软的文档,有些根本就看不懂,有些能看懂,但对我这种菜鸟也不会去用. 无从下手啊,前面放了几个链接,挨个试试吧. 一.显式打开连接 这个我测试过,有些时候,需要我们显示打开连接, ...

  3. Redis高级实践之————Redis短连接性能优化

    摘要: 对于Redis服务,通常我们推荐用户使用长连接来访问Redis,但是由于某些用户在连接池失效的时候还是会建立大量的短连接或者用户由于客户端限制还是只能使用短连接来访问Redis,而原生的Red ...

  4. EF框架的三种工作方式

    EF框架step by step(1)—Database-First EF框架step by step(2)—Model-First EF框架step by step(3)—Code-First 通过 ...

  5. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  6. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  7. EF框架之三种模式

    使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. Entity Framewo ...

  8. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...

随机推荐

  1. js---用对象来放置变量和方法

    在写JS的时候,可以考虑使用对象来放置命名的变量,以及常用的方法. 简单示例: var func = { name:'张三', showName:function(name){ console.log ...

  2. thinkphp项目部署在phpstudy里的nginx上

    朋友的一个thinkphp做的项目,让我帮他部署一下的,LINUX服务器,用宝塔. 第一台服务器,装上宝塔,宝塔里装NGINX,PHP5.6,再建立网站,绑定域名,访问成功,一切正常! 昨天试着给另一 ...

  3. Docker入门-docker运行springboot应用(二)

    环境准备 jdk8 安装docker 镜像加速器配置 docker私有仓库 springboot工程的jar包 docker部署项目 dockfile Dockfile是一种被Docker程序解释的脚 ...

  4. ARM 链接脚本分析

    分析连接脚本的语法规则 /* ---------------------------------------------------------------------------- * Memory ...

  5. Anaconda(二)

    三.配置依赖包仓库 conda在安装依赖包的时候会检测已有包的版本与需要安装的版本是否匹配.以及相关包更新后的版本与现有的其他包是否会造成冲突. 添加清华镜像源(依赖包仓库),命令行中直接使用以下命令 ...

  6. flutter 打包apk之后,安装在手机上无法访问网络解决方法

    </application> <uses-permission android:name="android.permission.READ_PHONE_STATE" ...

  7. kubernetes 1.9 安装部署

    参考地址:https://github.com/gjmzj/kubeasz 引言 提供快速部署高可用k8s集群的工具,基于二进制方式部署和利用ansible-playbook实现自动化,既提供一键安装 ...

  8. java上传文件类型检测

    在进行文件上传时,特别是向普通用户开放文件上传功能时,需要对上传文件的格式进行控制,以防止黑客将病毒脚本上传.单纯的将文件名的类型进行截取的方式非常容易遭到破解,上传者只需要将病毒改换文件名便可以完成 ...

  9. PHP表单select中有0选项的处理

    <div class="layui-inline"> <label class="layui-form-label">是否锁定</ ...

  10. jquery+css 点赞喜欢特效

    百度盘链接 https://pan.baidu.com/s/1Nu8fiUrdffsNd6usTsUESg 密码 mps4 效果: