现在的位置: 首页 > 综合 > 正文

EntityFramework5性能提升的原因分析

2013年09月01日 ⁄ 综合 ⁄ 共 3669字 ⁄ 字号 评论关闭

版本发展:

 框架                          EF         备注 

.net Framework 3.5    EF 1.0

.net Framework 4.0    EF 4.0   EF4.0是集成在 net framework中的,而4.1~4.4仅仅是在其上的引入,并非框架的本身

.net Framework 4.0    EF 4.1   引入了DbContext以及POCO模型,应该算是很大改进

.net Framework 4.0    EF 4.2   修复了4.1的几个bug

.net Framework 4.0    EF 4.3   引入了Code First
Migration.有了这个我们就不用通过丢弃数据库修改表结构了。

.net Framework 4.0    EF 4.4   修复了4.3的几个bug,这个也是刚不久发布,很少人用,但是支持.net
framework 4.0

.net Framework 4.5    EF 5.0   最新版本 包括四个新特性,之后会主要介绍。

                              EF 6.0    未来版本,未发布
 据官方博客称,将会脱离.net Framework单独存在


                微软官方数据说,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? 微软到底在哪个过程做了手脚。

 

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

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


但是不管是”冷查询“还是”热查询“,都要经历以上我们刚刚讨论的步骤,但是在每一步所花费的时间可就不一样了,这也就是为什么热查询要快于冷查询的原因了,究其原因在于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中表现的越出色。

抱歉!评论已关闭.