zoukankan      html  css  js  c++  java
  • 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中表现的越出色。


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


  • 相关阅读:
    1442. Count Triplets That Can Form Two Arrays of Equal XOR
    1441. Build an Array With Stack Operations
    312. Burst Balloons
    367. Valid Perfect Square
    307. Range Sum Query
    1232. Check If It Is a Straight Line
    993. Cousins in Binary Tree
    1436. Destination City
    476. Number Complement
    383. Ransom Note
  • 原文地址:https://www.cnblogs.com/A_ming/p/2646003.html
Copyright © 2011-2022 走看看