39

哪一个提供更好的性能?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 次时。平均执行时间如图所示:

第一个结果

无论实体框架花费超过 4 毫秒,ADO.NET 只花费了 2 毫秒。

导致第二次执行

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

第二个结果

问题

  1. 我认为 EF 在第一次执行时性能非常差 那么我们为什么要使用 EF?
  2. 为什么 EF 第二次执行比第一次执行快?
4

4 回答 4

61
  1. 第一次 EF 将元数据加载到内存中,这需要一些时间。它从 edmx 文件或源代码(如果您首先使用代码)构建模型的内存表示。实际上 EF 是在 ADO.NET 之上构建的,所以它不能更快​​。但它使开发速度更快。并提高代码的可维护性
  2. 见 1

查看 msdn 文章性能注意事项(实体框架)

于 2013-02-27T09:14:56.890 回答
14
  • 1) EF在使用数据库时让很多事情变得更加舒适。引擎盖下发生了很多事情,否则您将不得不手动编码。

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

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

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

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

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

于 2013-02-27T09:30:35.630 回答
8

在微软工作时,我写了一篇比较两者性能的博文。似乎它现在正在迁移中,所以你可能需要去互联网档案馆找到它......

我们非常注重确保使用 EF 的性能成本不可怕,在 V1 中不完美但相当可用。

近 10 年后,EF 团队在提高性能方面做得很好,特别是减少了不良情况,但通过设计,实体框架位于 ADO.Net 之上。因此,如果您的主要标准是原始性能,那么您应该选择 ADO.Net,并使用手动优化的 SQL。

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

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

于 2017-01-27T16:04:09.453 回答
3

我认为 EF 在第一次执行时性能非常差 那么我们为什么要使用 EF?

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

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

是的。EF 最重要的特性之一是缓存

于 2020-03-28T12:28:15.013 回答