景慎艷
(遼寧對(duì)外經(jīng)貿(mào)學(xué)院 信息管理系,遼寧 大連 116052)
.NET編程性能提升的研究與實(shí)踐
景慎艷
(遼寧對(duì)外經(jīng)貿(mào)學(xué)院 信息管理系,遼寧 大連 116052)
編程性能的優(yōu)化決定軟件產(chǎn)品的質(zhì)量和生命期。對(duì).NET中常用的DataTable的使用進(jìn)行深入分析,從使用DataRow、行索引訪問(wèn)數(shù)據(jù)、檢索數(shù)據(jù)等方面進(jìn)行編程性能測(cè)試和分析,給出DataTable類優(yōu)化的實(shí)踐策略。
.NET;性能提升;DataTable
.NET Framework中提供的DataTable是一個(gè)使用起來(lái)非常有用的類,它可以方便的裝載數(shù)據(jù)并對(duì)其中的數(shù)據(jù)進(jìn)行各種處理。所以,.NET的設(shè)計(jì)人員和編程人員非常喜歡使用DataTable。但是,如果使用不當(dāng)也會(huì)給程序的性能帶來(lái)很大的影響,尤其是對(duì)大數(shù)據(jù)量的裝載和處理,應(yīng)該更加謹(jǐn)慎、合理的使用DataTable,否則性能可能會(huì)低到讓人無(wú)法接受。
本文主要針對(duì)幾種DataTable非常普遍的使用場(chǎng)景,以理論和實(shí)踐相結(jié)合的方式來(lái)說(shuō)明DataTable的最佳實(shí)踐。
DataTable代表內(nèi)存中的數(shù)據(jù)表,它是ADO.NET庫(kù)中的核心對(duì)象。類似一個(gè)二維表,由行和列組成。DataTable中可以保存格式化的數(shù)據(jù),同時(shí)可以對(duì)其中的數(shù)據(jù)進(jìn)行添加、修改、刪除、過(guò)濾、獲取、排序等操作。本文主要涉及到數(shù)據(jù)過(guò)濾、數(shù)據(jù)獲取等操作。
利用MicroSoft Visual Studio2010中提供的“性能向?qū)А惫ぞ?,可以找出程序中存在的性能瓶頸。性能向?qū)y(cè)試結(jié)果如圖1所示:
圖1 性能向?qū)y(cè)試結(jié)果
從上圖中可以很明顯的看出,方法System.Data.DataTable.Select(string)占用了21.84%的cpu時(shí)間,也就說(shuō)明該方法存在性能問(wèn)題。
利用“性能向?qū)А惫ぞ呖梢哉页龀绦蛑写嬖诘乃行阅芷款i點(diǎn),找到這些瓶頸點(diǎn)之后就可以研究對(duì)策來(lái)解決這些性能問(wèn)題了。
測(cè)試代碼參照利用DataRow訪問(wèn)數(shù)據(jù)的代碼樣例。運(yùn)行結(jié)果如圖2所示:
從測(cè)試結(jié)果,可以看出利用列名取得數(shù)據(jù)的性能最差(745ms),所使用時(shí)間是分別利用其他兩種方式取得數(shù)據(jù)的2.4倍(317ms)和2.6倍(286ms)。利用DataColumn取得數(shù)據(jù)的性能與利用列索引取得數(shù)據(jù)的性能相當(dāng)。
圖2 利用DataRow訪問(wèn)數(shù)據(jù)的代碼樣例運(yùn)行結(jié)果
結(jié)論是:取得DataTable中的數(shù)據(jù)的時(shí)候,利用列索引取得數(shù)據(jù)的性能是最高的。但是這種方式也存在一定的弊端,那就是代碼的可讀性和可維護(hù)性會(huì)差一些。而使用列名取得數(shù)據(jù)的方式在代碼可讀性和可維護(hù)性上是最好的。所以,這就需要一個(gè)平衡點(diǎn),如果性能要求非常高,那么應(yīng)該采用列索引取得數(shù)據(jù)的方式,否則可以使用列名取得數(shù)據(jù)的方式。
測(cè)試代碼參照利用行索引訪問(wèn)數(shù)據(jù)的代碼樣例。運(yùn)行結(jié)果如圖3所示:
圖3 利用行索引訪問(wèn)數(shù)據(jù)的代碼樣例運(yùn)行結(jié)果
從測(cè)試結(jié)果,可以看出使用GetDataBySlowRowIndex方法取得數(shù)據(jù)的性能最差,原因是取得一行中每一列數(shù)據(jù)的時(shí)候都會(huì)重新取得DataRow,這就大大降低了運(yùn)行效率。而GetDataByQuickRowIndex方法對(duì)Get-DataBySlowRowIndex方法進(jìn)行了改善,即取得某一行中的所有列數(shù)據(jù)都會(huì)使用同一個(gè)DataRow對(duì)象,從而大大提升了運(yùn)行效率。GetDataByForEach方法對(duì)GetDataByQuickRowIndex方法進(jìn)行了改善,使用foreach來(lái)循環(huán)取得DataRow,又稍稍的提升了一些性能。
結(jié)論是:要盡量少的創(chuàng)建DataRow對(duì)象,另外foreach比普通的for循環(huán)的性能會(huì)好一些。
測(cè)試代碼參照檢索數(shù)據(jù)的代碼樣例。運(yùn)行結(jié)果如圖4所示:
圖4 檢索數(shù)據(jù)的代碼樣例運(yùn)行結(jié)果
可測(cè)試結(jié)果可以看出DataTable的Select方法的執(zhí)行效率非常低,而使用單純的循環(huán)效率就要好很多。
結(jié)論是:對(duì)于大數(shù)量的數(shù)據(jù)檢索,最好不要使用Select方式,尤其是循環(huán)內(nèi)進(jìn)行數(shù)據(jù)檢索的時(shí)候,堅(jiān)決要避免使用Select,否則性能會(huì)及其的低。建議使用單純的循環(huán)比較或者Linq方式得到檢索數(shù)據(jù)。
由于DataTable類是一個(gè)非常靈活、非常容易使用的類,所以幾乎所有的信息管理系統(tǒng)都會(huì)使用到它。但從實(shí)際情況看,由于設(shè)計(jì)者和開(kāi)發(fā)者對(duì)使用方法了解的不深入,導(dǎo)致大部分程序都存在性能問(wèn)題。參考本文提出的DataTable的使用方式,可以有效的解決由于DataTable操作引起的各種性能瓶頸。
[1]DataTable類說(shuō)明[EB/OL].(2013-03-31)[2013-07024]http://msdn.microsoft.com/zh-cn/library/system.data.datatable.aspx
[2]DataRow 類說(shuō)明.[EB/OL].(2013-03-31)[2013-07024]http://msdn.microsoft.com/zh-cn/library/system.data.datarow.aspx
[3]DataColu類說(shuō)明[EB/OL].(2013-03-31)[2013-07024].http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.aspx
[4]劉仲博.NET DataList與ListView性能對(duì)比研究[J].科技視界,2013(11):27-28.
[5]黃有福.基于ADO.NET數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)及性能優(yōu)化分析[J].硅谷,2012(20):22-23.
[6]鄒蕊,葛中澤.在ASP.NET AJAX中返回DataTable到客戶端Javascript[J].電子設(shè)計(jì)工程,2011(24)47-49.
[7]王明倩,鄒紅霞,田秋艷.ASP.NET性能深度優(yōu)化的探討[J].長(zhǎng)春師范學(xué)院學(xué)(自然科學(xué)版)報(bào),2007,26(4):99-102.
Research and Practice on the Promotion of Performance of.NET Programming
JING Shen-yan
(Department of Information Management,Liaoning University of International Business and Economics,Dalian 116052,China)
The optimization of programming performance determines the quality and lifetime of software products.This paper makes a deep analysis on the commonly used DataTable in.NET,and gives the practice strategy on the optimization of DataTable from testing and analyzing the programming performance of the use of DataRow,row index access data,retrieval data and so on.
.NET;performance promotion;DataTable
TP315
A
1009-3907(2013)10-1259-03
2013-07-24
景慎艷(1976-),女,吉林通化人,副教授,碩士,主要從事網(wǎng)絡(luò)應(yīng)用、數(shù)據(jù)庫(kù)應(yīng)用等方面的研究。
責(zé)任編輯:
吳旭云