性能分析ADO.NET和实体框架

时间:2013-02-27 09:06:04

标签: c# performance entity-framework ado.net

哪一个提供更好的性能? ADO.NET或实体框架。

这是我想要分析的两种方法。

ADO.NET测试方法

public void ADOTest()
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    using (SqlConnection con = new SqlConnection(connection))
    {
        string Query = "select * from Product ";
        SqlDataAdapter da = new SqlDataAdapter(Query, con);
        DataSet ds = new DataSet();
        con.Open();
        da.Fill(ds);
        DataView dv = ds.Tables[0].DefaultView;
    }
    stopwatch.Stop();
    Console.WriteLine("ADO.NET Time Elapsed={0}", stopwatch.Elapsed);
}

实体框架测试方法

public void EFTest()
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    var list = _OnlineStoreEntities.Products.ToList();
    stopwatch.Stop();
    Console.WriteLine("Entity Framework Elapsed={0}", stopwatch.Elapsed);
}

首次执行的结果

当我运行上述方法超过100次时。平均执行时间显示在图像中:

first result

ADO.NET只花了2毫秒,实体框架是否耗时超过4毫秒。

导致第二次执行

当我一次又一次地运行此方法时。 ADO.NET和EF之间的平均执行时间并不多:

second result

问题

  1. 我认为EF在首次执行中表现最差,那么为什么我们使用EF?
  2. 为什么EF第二次执行比第一次执行要快?

4 个答案:

答案 0 :(得分:55)

  1. 首次EF将元数据加载到内存中,这需要一些时间。它从edmx文件构建模型的内存表示,或者如果您首先使用代码则从源代码构建。实际上EF是在ADO.NET的顶层构建的,所以它不能更快​​。但它使开发更多更快。并改进代码的可维护性
  2. 见1
  3. 查看msdn文章Performance Considerations (Entity Framework)

答案 1 :(得分:11)

  • 1)在使用数据库时,EF会使很多事情更舒适。在引擎盖下有很多事情你不得不手动编码。

例如,我的第一个更大的项目之一是处理大量数据,我使用ADO.NET实现了访问层。这占整个项目的四分之一甚至三分之一。

根据我今天的EF经验,我几乎可以摆脱所有这些! 我只是手工编写的许多复杂代码完全没必要。我们在这里谈论成千上万行。

  • 2)这里有两个主要原因。首先,EF是在使用ADO.NET的基础上构建的。这意味着everthing EF会对ADO所做的事情增加更多开销。第二个(非常)简单地说,JIT编译器在执行时第一次编译代码。这包括内存分配和各种初始化。

这意味着您多次运行的代码从第二次开始运行得更快。另一方面,如果只执行一次EF查询,那么这些初始化将无法获得收益。

在实际应用程序中,您可能会尝试进行一些优化,例如使用Compiled Queries。性能方面,这将对您有所帮助,因为现在您的查询不需要在每次运行时编写和编译,而只需要编译一次。

答案 2 :(得分:6)

在微软工作期间,我写了一篇博文,比较两者的表现。似乎它现在正在迁移过程中,因此您可能需要访问Internet存档才能找到它...

我们一直专注于确保使用EF的性能成本并不可怕,在V1中并不完美,但非常实用。

虽然近10年后EF团队在提高性能,特别是减少不良案例场景方面做得很好,但按照设计,实体框架位于ADO.Net之上。因此,如果您的主要标准是原始性能,那么您应该使用手动优化的SQL来使用ADO.Net。

话虽如此,许多其他优秀的开发人员,并没有制作出最好的SQL;实体框架将它们与编写查询隔离开来,并使用良好实践来产生相当好的查询。

实体框架的主要优点是提供更高级别的抽象来处理数据,将应用程序开发人员与底层数据模型隔离开来。因此,您可以使用EF提高工作效率,编写更少的数据访问代码;您仍然可以微调特定的查询或数据操作,而不会丢失使非性能关键代码更容易编程的抽象,这是任何业务应用程序的最大部分,例如。

答案 3 :(得分:1)

我认为EF在首次执行时性能最差,那为什么我们要使用EF?

  1. 为数据访问层自动生成的代码
  2. 减少开发时间和成本
  3. 也允许LINQ查询。

为什么EF第二次执行比第一次执行快?

是的。 EF的最重要功能之一是缓存