Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

2年前关闭。



Improve this question




我是使用ORM来处理数据库的新手,目前正在制作一个新项目,必须决定是否使用Entity Framework或Dapper。我读了很多文章,说Dapper比Entity Framework快。

因此,我制作了2个简单的原型(prototype)项目,一个使用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());

Entity Framework 项目
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
IEnumerable<Employee> emplist = hrctx.Employees.ToList();
sw.Stop();
MessageBox.Show(sw.ElapsedMilliseconds.ToString());

在仅第一次运行项目多次尝试上述代码后,dapper代码将更快,并且在第一次运行之后,我总是从 Entity Framework 项目中获得更好的结果
我还在 Entity Framework 项目上尝试了以下语句以停止延迟加载
hrctx.Configuration.LazyLoadingEnabled = false;

但除了第一次外,相同的EF执行速度更快。

尽管网上的所有文章都说相反,但在此示例中,任何人都可以给我解释或指导以使EF更快的原因

更新

我将实体示例中的代码行更改为
IEnumerable<Employee> emplist = hrctx.Employees.AsNoTracking().ToList();

如某些文章中所述,使用 AsNoTracking 可以停止 Entity Framework 缓存,并且在停止缓存之后,dapper示例的性能更好(但差别不大)

最佳答案

ORM(对象关系映射器)是一种工具,可在您的应用程序和数据源之间创建层,并向您返回关系对象,而不是
(根据您正在使用的C#)ADO.NET对象。这是每个ORM要做的基本事情。

为此,ORM通常执行查询,并将返回的DataReader 映射到POCO类。 Dapper仅限此处。

为了进一步扩展此功能,某些ORM(也称为“完整ORM”)会做更多的事情,例如为您生成查询以使应用程序数据库独立,为将来的调用缓存数据,为您管理工作单元等等。所有这些都是好的工具,可以为ORM增值;但这要付出代价。 Entity Framework 属于此类。

要生成查询,EF必须执行其他代码。缓存提高了性能,但是管理缓存需要执行其他代码。对于工作单元和EF提供的任何其他附加功能也是如此。所有这些节省了,为编写了额外的代码,省去了EF的费用。

成本是性能。由于Dapper做的很基础,所以速度更快。但您必须编写更多代码。由于EF的功能远不止于此,它的速度(位)更慢。但您必须编写更少的代码。

那么,为什么您的测试显示相反的结果?
因为您执行的测试无法比较。

完整的ORM具有许多良好的功能,如上所述。其中之一是UnitOfWork。跟踪是UoW的职责之一。首次请求对象(SQL查询)时,它将导致数据库往返。然后将该对象保存在内存缓存中。完整的ORM跟踪对此已加载对象所做的更改。如果再次请求相同的对象(在同一UoW范围内的其他SQL查询包含已加载的对象),则它们不会进行数据库往返。相反,它们从内存缓存中返回对象。这样,可以节省大量时间。
Dapper不支持此功能,这会使它在测试中的执行速度变慢。

但是,仅当同一对象多次加载时,此好处才适用。同样,如果加载到内存中的对象数过多,则会减慢整个ORM的速度,因为那样检查内存中的对象所需的时间会更长。同样,这种好处取决于用例。

关于c# - 为什么在直接选择语句中Entity Framework的执行速度比Dapper快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43569749/

10-13 06:46