性能分析 ADO.NET 和 Entity Framework

40

哪个表现更好?ADO.NET还是Entity Framework。

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

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毫秒,而Entity Framework则需要超过4毫秒。

第二次执行的结果

当我连续单次运行这个方法时,ADO.NET和EF的平均执行时间差异不大:

second result

问题:

  1. 我认为EF在第一次执行时表现得很差,那么我们为什么还要使用EF呢?
  2. 为什么EF第二次执行比第一次执行快?
4个回答

61
  1. 第一次 EF 加载元数据到内存中需要时间。它会从 edmx 文件或者代码中构建模型的内存表示。实际上,EF 是在 ADO.NET 的基础上构建的,所以它不能更快。但是它可以使开发速度更快,并提高代码的可维护性。
  2. 见 1

请查看 msdn 文章 性能考虑因素(Entity Framework)


3
如果使用LINQ从数据库中获取或处理有选择性的数据,EF会更快。一个大型或复杂的SQL查询可以实现为简单的LINQ查询,在EF中运行速度更快,而ADO.NET则不然。我们不应该仅仅因为简单的数据获取就将ADO.NET与EF进行比较。 - rafidheen
2
我认为LINQ在处理复杂查询时比SQL更简单这一点是相当主观的。 - user441521
@rafidheen,您能否解释一下如何比普通的ado.net查询更快地运行该查询? - Ninja

14
  • 1) EF在处理数据库时可以让很多事情变得更加舒适。在幕后会自动完成许多你原本需要手动编写的代码。

例如,我最早的一个大型项目中涉及了很多数据处理,我使用ADO.NET实现了访问层。这占据了整个项目的四分之一甚至三分之一。

而现在有了EF的经验,我几乎可以摆脱所有手写的复杂代码。我们谈论的是数千行的代码。

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

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

在实际应用中,您可能会尝试进行一些优化,例如使用编译查询。从性能上讲,这将极大地帮助您,因为现在您的查询不需要每次运行时都准备和编译,而只需要一次。

8
在微软工作期间,我写了一篇博客文章比较它们的性能。看起来现在正在迁移过程中,所以你可能需要去互联网档案馆查找...我们花了很多时间确保使用EF时性能成本不是太糟糕的,虽然在V1中并不完美,但相当可用。
虽然现在距离那时已经有近10年了,EF团队在提高性能方面做了很好的工作,特别是减少了一些坏情况,但从设计上来说,Entity Framework位于ADO.Net之上。所以,如果您的主要标准是原始性能,您应该选择手动优化SQL的ADO.Net。
话虽如此,很多优秀的开发人员并不能编写最好的SQL;Entity Framework使他们远离编写查询,并使用良好的实践来生成合理的查询。
Entity Framework的主要优点是提供更高层次的数据抽象,使应用程序开发人员与底层数据模型分离。因此,您可以使用EF更加高效地编写代码,减少数据访问代码的编写量;同时,在非关键性能代码(业务应用程序中最大的部分)中,您仍然可以调整特定的查询或数据操作,而不会失去易于编程的抽象。

3

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接