【问题标题】:Performance analyze ADO.NET and Entity Framework性能分析 ADO.NET 和实体框架
【发布时间】:2013-02-27 09:06:03
【问题描述】:

哪一个提供更好的性能? 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 第二次执行比第一次执行更快?

【问题讨论】:

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


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

    看看msdn文章Performance Considerations (Entity Framework)

    【讨论】:

    • 如果您使用 LINQ 从数据库中获取或处理选择性数据,EF 会更快。大型或复杂的 SQL 查询可以实现为简单的 LINQ 查询,它在 EF 中比 ADO.NET 运行得更快。我们不应该仅仅为了简单的数据获取而将 ADO.NET 与 EF 进行比较。
    • 我认为 LINQ 在处理复杂查询时比 SQL 更简单,这是相当主观的。
    • @rafidheen 你能解释一下这个查询如何运行得比普通的 ado,net 更快吗?
    【解决方案2】:
    • 1) 使用数据库时,EF 让很多事情更舒适。引擎盖下发生了很多事情,否则您将不得不手动编写代码。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      在 Microsoft 工作期间,我写了一篇博文比较两者的性能。好像现在正在迁移中,所以你可能需要去互联网存档找到它......

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-13
          • 1970-01-01
          • 2023-03-03
          • 2011-01-15
          相关资源
          最近更新 更多