EntityFramework5的性能到底提高在哪里了?

      微软官方数据说,EF5.0的性能比EF4.x提高了很多倍。但是到底EF5.0为什么会比EF4.x提高那么多倍呢?到底是对哪一部分进行了性能优化呢?今天我们就来一探究竟。

      为了解释这一问题,引入一段普通的数据库查询代码:          

               using (var db = new ProductContext()) 
              {
                    var allFoods = from p in db.Products
                                   where p.CategoryId == "FOOD"
                                   orderby p.Name
                                   select p;
                    Product productss = allFoods.First();
                } 

 上面代码非常好理解,就是查找符合条件的第一个food,延迟查询,真正查询是在First()执行的时候开始的,这个大家都懂,但是大家知道在执行这段代码的时候EntityFramework为我们做了哪些工作吗?让我们一步一步分析一下这段代码:

首先: 

       using (var db = new ProductContext()) 这个没什么好解释的,就是创建一context对象。

其次: 

                    var allFoods = from p in db.Products
                                   where p.CategoryId == "FOOD"
                                   orderby p.Name

                                   select p; 

这段代码是查询表达式的创建,因为是延迟查询,所以并未做任何工作,仅仅是一段用Linq语法写的代码而已。

最后:

 Product productss = allFoods.First();

这句代码才是今天的主题部分,让我们对他进行一些内部的跟踪:

       1.元数据加载

       2.视图的生成

       3.解析linq查询中的参数

       4.查询转换  就是将Linq语句通过linq引擎转化为SQL语句

       5.生成具体的查询字符串,为数据库查询做实质性的准备

       6.数据库查询 ,分为以下三个步骤,也就是我们以前经产用的ADO.NET查找数据过程

                  *Connection.open()

                  *Command.ExcuteReader()

                  *DataReader.Read()

       7.通过查询的数据库生成实体对象,也就是我们查询拿到的结果对象集

       8. Connection.Close()

上面的过程是整个EF进行一次数据查询的过程, 之所以介绍这个,希望读到这篇文章的您能理解EF到底为我们做了些什么东西?知道了这些过程,之后再对这些过程进行一些性能分析,真正解析EF5在性能上为什么快于EF4? 微软到底在哪个过程做了手脚。

之前我在http://www.cnblogs.com/A_ming/archive/2012/08/17/2643266.html一文中提到过

一次通过Linq to Entity 查询性能与之前版本几乎一样,但第二次及以后在进行同样查询就大大不一样了”

这里提到的第一次查询,称之为“冷查询”

第二次进行相同的查询,称之为”热查询“


但是不管是”冷查询“还是”热查询“,都要经历以上我们刚刚讨论的步骤,但是在每一步所花费的时间可就不一样了,这也就是为什么热查询要快于冷查询的原因了,究其原因在于Cache,请看下表:

   冷查询:   


 

                                                            EF4性能表现                                    EF5性能表现

        1.元数据加载                               影响很大,但做Cache                        影响很大,但做Cache

       2.视图的生成                                 可能影响很大,但做Cache                  可能影响很大,但做Cache

       3.解析linq查询中的参数                    影响一般                                        影响很小(性能改善了

       4.查询转换                                    影响一般                                        影响一般,但做Cache 

       5.生成具体的查询字符串                   影响一般,但做Cache                        影响一般,但做Cache 

       6.数据库查询                                 可能会非常高                                   可能会非常高

                  *Connection.open()                                               (在某些情况下进行了一定处理,性能提高)

                  *Command.ExcuteReader()

                  *DataReader.Read()

       7.通过查询的数据库生成实体对象        影响一般                                          影响一般

       8. Connection.Close()                   影响一般                                           影响一般

 

   热查询:


 

                                                    EF4性能表现                                        EF5性能表现

        1.元数据加载  打                          很低,因为在冷查询中做了cache           很低,有Cache缘故

       2.视图的生成                                 很低,原因同上                                很低,同上

       3.解析linq查询中的参数                    影响一般                                         影响很小(性能改善了

       4.查询转换                                    影响一般                                          很低,有Cache

       5.生成具体的查询字符串                    很低,有Cache                                 很低,有Cache

       6.数据库查询                                 可能会非常高                                    可能会非常高

                  *Connection.open()                                               (在某些情况下进行了一定处理,性能提高)

                  *Command.ExcuteReader()

                  *DataReader.Read()

       7.通过查询的数据库生成实体对象        影响一般                                           影响一般

       8. Connection.Close()                   影响一般                                            影响一般 

 

结论:

从以上两张表可以看出,无论是冷查询,还是热查询,EF5的性能都要比EF4要高。

在冷查询的表现中,EF5比EF4似乎有微弱优势;但是在热查询中,因为EF5在某些步骤中多做了些缓存的处理,所以使得热查询的速率提升了不知道多少倍,这个也就是真正的EF5提升性能的原因所在,希望读者仔细对比表格。查找原因所在。

所以说,这次EF5的性能提升,主要是针对热查询来的,因为在冷查询中多做了些缓存工作,使得热查询可以很快的执行。我们都知道,经常一个服务器做的是一些重复的查询,这些重复的查询多了,性能的优势在EF5中表现的越出色。

 

 


备注:希望分享的知识能够对您有帮助。限于作者水平有限,如果有不对的知识请直接评论指出,谢谢!


posted @ 2012-08-19 00:26  纯粹的郭子  阅读(6861)  评论(28编辑  收藏