HTML5技术

EntityFramework、Dapper vs 草根框架性能大比拼,数据库访问哪家强? - 我叫So(3)

字号+ 作者:H5之家 来源:博客园 2016-07-19 11:00 我要评论( )

不过仔细看测试2.1的测试代码,发现循环体内包含了创建 DbContext 的代码,我在想会不会是因为多次创建 DbContext 而导致 EF 如此慢?如果把创建 DbContext 的代码放到循环体外 EF 会不会更好点?于是就有了测试2.2

不过仔细看测试2.1的测试代码,发现循环体内包含了创建 DbContext 的代码,我在想会不会是因为多次创建 DbContext 而导致 EF 如此慢?如果把创建 DbContext 的代码放到循环体外 EF 会不会更好点?于是就有了测试2.2。

测试2.2:

LoopQueryTestWithNotCreateDbContext { static int takeCount = 1; static int queryCount = 20000; GCMemoryTest() { /* * 内存分配测试通过 vs 自带诊断与分析工具测,vs --> 分析 --> 性能与诊断 --> 内存使用率。 * 每次运行程序只能调用下面中的一个方法,不能同时调用 */ EFSqlQueryTest(takeCount, queryCount); } SpeedTest() { long useTime = 0; //预热 ChloeQueryTest(1, 1); useTime = SW.Do(() => { ChloeQueryTest(takeCount, queryCount); }); Console.WriteLine("ChloeQueryTest 执行{0}次查询总用时:{1}ms", queryCount, useTime); GC.Collect(); useTime = SW.Do(() => { ChloeSqlQueryTest(takeCount, queryCount); }); Console.WriteLine("ChloeSqlQueryTest 执行{0}次查询总用时:{1}ms", queryCount, useTime); GC.Collect(); //预热 DapperQueryTest(1, 1); useTime = SW.Do(() => { DapperQueryTest(takeCount, queryCount); }); Console.WriteLine("DapperQueryTest 执行{0}次查询总用时:{1}ms", queryCount, useTime); GC.Collect(); //预热 EFLinqQueryTest(1, 1); useTime = SW.Do(() => { EFLinqQueryTest(takeCount, queryCount); }); Console.WriteLine("EFLinqQueryTest 执行{0}次查询总用时:{1}ms", queryCount, useTime); GC.Collect(); //预热 EFSqlQueryTest(1, 1); useTime = SW.Do(() => { EFSqlQueryTest(takeCount, queryCount); }); Console.WriteLine("EFSqlQueryTest 执行{0}次查询总用时:{1}ms", queryCount, useTime); GC.Collect(); Console.WriteLine("GAME OVER"); Console.ReadKey(); } static void ChloeQueryTest(int takeCount, int loops) { using (MsSqlContext context = new MsSqlContext(DbHelper.ConnectionString)) { for (int i = 0; i < loops; i++) { int id = 0; var list = context.Query<TestEntity>().Where(a => a.Id > id).Take(takeCount).ToList(); } } } static void ChloeSqlQueryTest(int takeCount, int loops) { using (MsSqlContext context = new MsSqlContext(DbHelper.ConnectionString)) { for (int i = 0; i < loops; i++) { int id = 0; var list = context.SqlQuery<TestEntity>(string.Format("select top {0} * from TestEntity where Id>@Id", takeCount.ToString()), DbParam.Create("@Id", id)).ToList(); } } } static void DapperQueryTest(int takeCount, int loops) { using (IDbConnection conn = DbHelper.CreateConnection()) { for (int i = 0; i < loops; i++) { int id = 0; var list = conn.Query<TestEntity>(string.Format("select top {0} * from TestEntity where Id>@Id", takeCount.ToString()), new { Id = id }).ToList(); } } } static void EFLinqQueryTest(int takeCount, int loops) { using (EFContext efContext = new EFContext()) { for (int i = 0; i < loops; i++) { int id = 0; var list = efContext.TestEntity.AsNoTracking().Where(a => a.Id > id).Take(takeCount).ToList(); } } } static void EFSqlQueryTest(int takeCount, int loops) { using (EFContext efContext = new EFContext()) { for (int i = 0; i < loops; i++) { int id = 0; var list = efContext.Database.SqlQuery<TestEntity>(string.Format("select top {0} * from TestEntity where Id>@Id", takeCount.ToString()), new SqlParameter("@Id", id)).ToList(); } } } }

View Code

运行5次,得到以下结果:

 

ChloeQueryTest(ms)

ChloeSqlQueryTest(ms)

DapperQueryTest(ms)

EFLinqQueryTest(ms)

EFSqlQueryTest(ms)

第1轮

15281

11858

11981

31394

19309

第2轮

15194

12177

12314

31464

18161

第3轮

15967

12348

12366

31082

18030

第4轮

15371

11793

12479

32314

18356

第5轮

15350

11921

11937

35023

18356

平均

15411

12019

12215

32255

18442

 

GC 情况:

 

ChloeQueryTest

ChloeSqlQueryTest

DapperQueryTest

EFLinqQueryTest

EFSqlQueryTest

GC回收次数

111

41

47

368

205

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? - Jeffcky

    EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗? -

    2017-04-05 14:03

  • EntityFramework Core不得不注意的性能优化意外收获,你会用错? - Jeffcky

    EntityFramework Core不得不注意的性能优化意外收获,你会用错? - J

    2017-04-05 14:00

  • DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架 - Frank.Cui

    DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的OR

    2017-03-18 14:07

  • 用DapperExtensions和反射来实现一个通用搜索 - yt1983

    用DapperExtensions和反射来实现一个通用搜索 - yt1983

    2017-03-09 08:00

网友点评
t