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中表現的越出色。

 

 


備注:希望分享的知識能夠對您有幫助。限於作者水平有限,如果有不對的知識請直接評論指出,謝謝!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM