【发布时间】:2017-04-23 10:06:56
【问题描述】:
我是使用 ORM 处理数据库的新手,目前我正在制作一个新项目,我必须决定是否使用实体框架或 Dapper。我读过很多文章说 Dapper 比 Entity Framework 快。
所以我做了 2 个简单的原型项目,一个使用 Dapper,另一个使用 Entity Framework 和一个函数来从一张表中获取所有行。 表架构如下图
两个项目的代码如下
用于 Dapper 项目
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
IEnumerable<Emp> emplist = cn.Query<Emp>(@"Select * From Employees");
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString());
对于实体框架项目
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
IEnumerable<Employee> emplist = hrctx.Employees.ToList();
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString());
仅在我第一次运行项目时多次尝试上述代码后,dapper 代码会更快,并且在第一次之后,我总是从实体框架项目中获得更好的结果 我还在实体框架项目上尝试了以下语句来停止延迟加载
hrctx.Configuration.LazyLoadingEnabled = false;
但除第一次外,相同的 EF 执行速度更快。
任何人都可以给我解释或指导是什么让 EF 在这个示例中更快,尽管网络上的所有文章都说相反
更新
我已将实体示例中的代码行更改为
IEnumerable<Employee> emplist = hrctx.Employees.AsNoTracking().ToList();
使用某些文章中提到的 AsNoTracking 会停止实体框架缓存,并且在停止缓存后,dapper 示例的性能会更好,(但差别不大)
【问题讨论】:
-
这不是一个基准测试...您只是在测试一个 非常 基本场景,其中 EF 恰好更快,因为它没有很多事情要做。在实际场景中,您可能会发现 Dapper 更快(因为它只做一件事:将查询结果映射到对象),但您必须编写更多代码来做同样的事情。
-
您应该尝试真实场景,包括连接、过滤器、分组、更新、插入等
-
当您使用几个连接进行查询时,您将开始注意到巨大的性能差异,一旦 ef 需要编译您的查询,您将获得性能影响
-
我很久以前做了一些测试,发现 EF 在返回少量行时始终更快。我仍然不确定为什么会这样,但我猜我认为 EF 可能会在默认设置上做更好的连接管理。在映射方面,我认为 EF 和 dapper 之间没有显着的性能差异,但是,如果您想要对查询进行边缘性能调整,那么您无法使用 LINQ ORM 做一些事情。我的(旧)文章在这里:blog.staticvoid.co.nz/2012/3/24/…
-
这种测试没用。您应该测试很多操作(所有 CRUD)并使用真正的 ORM,而不是 dapper。 Linq2db 有一些精巧的高级功能,甚至 EF 都做不到,并且可以与 Linq 一起使用,因此运行基准测试是一个更好的选择。
标签: c# entity-framework dapper