自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

百寶箱剖析ADO.NET Entity框架性能

開發(fā) 后端
這里介紹了ADO.NET Entity框架的性能,演示了如何提高簡單查詢速度的方法,并闡釋了框架的性能特征。希望大家可以從中得到收獲。

#T#在網(wǎng)上看到一篇文章是關(guān)于講解ADO.NET Entity框架??戳酥笊钣畜w會(huì),在這里我就把我所看到的和大家在一起分享一下。ADO.NET團(tuán)隊(duì)最近討論了ADO.NET Entity框架的各種性能特征。ADO.NET Entity框架在12月已經(jīng)進(jìn)入它的第三個(gè)beta版本,自那時(shí)起開發(fā)團(tuán)隊(duì)就開始為開發(fā)人員提供了使用該框架的相關(guān)信息。而現(xiàn)在,則為開發(fā)人員提供了框架性能方面的信息。

本文鞭辟入里地介紹了ADO.NET Entity框架的性能,演示了如何提高簡單查詢速度的方法,并闡釋了框架的性能特征。需要重點(diǎn)指出的是,當(dāng)一個(gè)抽象層或者類似EDM(譯注:指Entity Data Model)的模塊被用來轉(zhuǎn)換數(shù)據(jù)庫的關(guān)系樣式時(shí),會(huì)帶來一定的性能損失。

查詢與結(jié)果

本文使用了NorthWind數(shù)據(jù)庫作為模型,并創(chuàng)建了一個(gè)簡單查詢:

  1. (NorthwindEntities ne = NorthwindEntities()) { (Order o ne.Orders) { i = o.OrderID; } } 

測(cè)試時(shí),我們的每個(gè)查詢對(duì)整個(gè)848行數(shù)據(jù)進(jìn)行了10次遍歷。結(jié)果很有意思,第1次運(yùn)行時(shí)耗費(fèi)了4241毫秒,而接下來的每次運(yùn)行則平均耗費(fèi)13毫秒左右的時(shí)間。最耗時(shí)的一部分內(nèi)容是ObjectContext的創(chuàng)建,而在執(zhí)行任意一個(gè)訪問數(shù)據(jù)庫的操作時(shí),都會(huì)有一些耗時(shí)的操作發(fā)生。耗時(shí)百分比值最大的是視圖生成,它達(dá)到了驚人的56%。既然視圖生成是造成性能損耗的罪魁禍?zhǔn)?,那么開發(fā)人員最好是使用命令行工具EDM生成器(EdmGen.exe),運(yùn)行時(shí)需要加上視圖生成命令參數(shù)(/mode:ViewGeneration),它的輸出內(nèi)容為一個(gè)代碼文件(C#或者VB.NET),可以包含在項(xiàng)目中。視圖的預(yù)生成可以將啟動(dòng)時(shí)間降低到2933毫秒,而對(duì)于循環(huán)遍歷操作,整個(gè)時(shí)間可以降低28%。生成視圖并隨著應(yīng)用程序一起發(fā)布是提高性能的妙方,但其缺點(diǎn)則在于視圖不再是動(dòng)態(tài)的,一旦模型發(fā)生改變,就需要重新生成以保持同步。

ADO.NET Entity框架查詢性能

需要指出的是關(guān)于性能的主要設(shè)計(jì)要素是查詢緩存。一旦執(zhí)行了查詢,它的一部分內(nèi)容就被維持在全局緩存中。由于查詢與元數(shù)據(jù)緩存的存在,使得第二次運(yùn)行的執(zhí)行速度總是比第一次運(yùn)行快。例如,如下的Entity SQL查詢:

  1. (PerformanceArticleContext ne = PerformanceArticleContext())   
  2. { ObjectQuery<Orders> orders = ne.CreateQuery<Orders>();   
  3. (Orders o orders) { i = o.OrderID; } } 

第一次運(yùn)行該查詢耗時(shí)179毫秒,但下一次運(yùn)行則只耗費(fèi)了15毫秒的時(shí)間。首次運(yùn)行與后續(xù)運(yùn)行在執(zhí)行方面的區(qū)別在于它構(gòu)建了能夠?yàn)閳?zhí)行傳遞provider的命令樹(command tree)。

ADO.NET Entity框架之LINQ查詢?cè)趫?zhí)行方式上與Entity SQL查詢相似。例如,下面的查詢:

  1. (PerformanceArticleContext ne = PerformanceArticleContext())  
  2. { var orders = from order ne.Orders select order;   
  3. (Orders o orders) { i = o.OrderID; } } 

首次執(zhí)行LINQ查詢耗時(shí)202毫秒,而隨后的執(zhí)行耗時(shí)18毫秒,兩者的差距還要低于Entity SQL??梢钥吹剑褂镁幾g了的LINQ查詢對(duì)于性能的提高更為明顯。編譯LINQ查詢的好處在于它構(gòu)建了表達(dá)樹(expression tree),當(dāng)查詢被編譯時(shí),后續(xù)的執(zhí)行就不需要重建表達(dá)樹了。編譯的LINQ查詢代碼看起來像這樣:

  1. Func<PerformanceArticleContext, IQueryable<Orders>> compiledQuery 
    CompiledQuery.Compile((PerformanceArticleContext ne) => (from o ne.Orders select o));   
  2. (PerformanceArticleContext ne = PerformanceArticleContext()) { (Orders o compiledQuery(ne)) { i = o.OrderID; } }  

注意,PerformanceArticleContext是一個(gè)委托。對(duì)于編譯了的LINQ查詢而言,第一次執(zhí)行耗時(shí)305毫秒,而隨后的執(zhí)行時(shí)間則為15毫秒。結(jié)果并不驚人,值得關(guān)注的是編譯的LINQ查詢比之常規(guī)方式的LINQ查詢,執(zhí)行時(shí)間少了3毫秒?;蛟S對(duì)于幾個(gè)查詢而言,這算不上什么,但如果有數(shù)以千計(jì)的查詢,這樣的性能提升就倍顯價(jià)值所在了。

責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-11-12 14:18:19

ADO.NET分頁

2009-11-03 16:57:34

ADO.NET FAQ

2009-10-27 13:14:35

VB.NET窗體應(yīng)用

2015-09-22 15:24:27

SDNDocker

2015-09-22 16:11:41

SDNDocker

2009-10-28 09:48:31

VB.NET XmlR

2009-10-28 14:51:33

VB.NET設(shè)計(jì)制作窗

2009-10-27 15:42:04

VB.NET文件對(duì)象

2009-10-28 13:54:38

linux安裝顯卡驅(qū)動(dòng)

2009-10-28 12:05:32

linux監(jiān)控技術(shù)

2011-04-13 09:40:27

2009-11-05 11:12:21

WCF自宿主

2009-10-28 18:35:10

Linux基礎(chǔ)用戶

2009-11-09 11:31:47

WCF消息隊(duì)列

2009-12-30 10:02:37

ADO.NET Ent

2025-04-17 08:28:13

2009-11-13 13:35:54

ADO.NET數(shù)據(jù)服務(wù)

2009-11-16 14:52:16

PHP數(shù)組

2009-12-22 14:46:09

ADO.NET Ent
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)