景慎艷
(遼寧對外經貿學院 信息管理系,遼寧 大連 116052)
.NET編程性能提升的研究與實踐
景慎艷
(遼寧對外經貿學院 信息管理系,遼寧 大連 116052)
編程性能的優(yōu)化決定軟件產品的質量和生命期。對.NET中常用的DataTable的使用進行深入分析,從使用DataRow、行索引訪問數據、檢索數據等方面進行編程性能測試和分析,給出DataTable類優(yōu)化的實踐策略。
.NET;性能提升;DataTable
.NET Framework中提供的DataTable是一個使用起來非常有用的類,它可以方便的裝載數據并對其中的數據進行各種處理。所以,.NET的設計人員和編程人員非常喜歡使用DataTable。但是,如果使用不當也會給程序的性能帶來很大的影響,尤其是對大數據量的裝載和處理,應該更加謹慎、合理的使用DataTable,否則性能可能會低到讓人無法接受。
本文主要針對幾種DataTable非常普遍的使用場景,以理論和實踐相結合的方式來說明DataTable的最佳實踐。
DataTable代表內存中的數據表,它是ADO.NET庫中的核心對象。類似一個二維表,由行和列組成。DataTable中可以保存格式化的數據,同時可以對其中的數據進行添加、修改、刪除、過濾、獲取、排序等操作。本文主要涉及到數據過濾、數據獲取等操作。
利用MicroSoft Visual Studio2010中提供的“性能向導”工具,可以找出程序中存在的性能瓶頸。性能向導測試結果如圖1所示:

圖1 性能向導測試結果
從上圖中可以很明顯的看出,方法System.Data.DataTable.Select(string)占用了21.84%的cpu時間,也就說明該方法存在性能問題。
利用“性能向導”工具可以找出程序中存在的所有性能瓶頸點,找到這些瓶頸點之后就可以研究對策來解決這些性能問題了。
測試代碼參照利用DataRow訪問數據的代碼樣例。運行結果如圖2所示:
從測試結果,可以看出利用列名取得數據的性能最差(745ms),所使用時間是分別利用其他兩種方式取得數據的2.4倍(317ms)和2.6倍(286ms)。利用DataColumn取得數據的性能與利用列索引取得數據的性能相當。

圖2 利用DataRow訪問數據的代碼樣例運行結果
結論是:取得DataTable中的數據的時候,利用列索引取得數據的性能是最高的。但是這種方式也存在一定的弊端,那就是代碼的可讀性和可維護性會差一些。而使用列名取得數據的方式在代碼可讀性和可維護性上是最好的。所以,這就需要一個平衡點,如果性能要求非常高,那么應該采用列索引取得數據的方式,否則可以使用列名取得數據的方式。
測試代碼參照利用行索引訪問數據的代碼樣例。運行結果如圖3所示:

圖3 利用行索引訪問數據的代碼樣例運行結果
從測試結果,可以看出使用GetDataBySlowRowIndex方法取得數據的性能最差,原因是取得一行中每一列數據的時候都會重新取得DataRow,這就大大降低了運行效率。而GetDataByQuickRowIndex方法對Get-DataBySlowRowIndex方法進行了改善,即取得某一行中的所有列數據都會使用同一個DataRow對象,從而大大提升了運行效率。GetDataByForEach方法對GetDataByQuickRowIndex方法進行了改善,使用foreach來循環(huán)取得DataRow,又稍稍的提升了一些性能。
結論是:要盡量少的創(chuàng)建DataRow對象,另外foreach比普通的for循環(huán)的性能會好一些。
測試代碼參照檢索數據的代碼樣例。運行結果如圖4所示:

圖4 檢索數據的代碼樣例運行結果
可測試結果可以看出DataTable的Select方法的執(zhí)行效率非常低,而使用單純的循環(huán)效率就要好很多。
結論是:對于大數量的數據檢索,最好不要使用Select方式,尤其是循環(huán)內進行數據檢索的時候,堅決要避免使用Select,否則性能會及其的低。建議使用單純的循環(huán)比較或者Linq方式得到檢索數據。
由于DataTable類是一個非常靈活、非常容易使用的類,所以幾乎所有的信息管理系統(tǒng)都會使用到它。但從實際情況看,由于設計者和開發(fā)者對使用方法了解的不深入,導致大部分程序都存在性能問題。參考本文提出的DataTable的使用方式,可以有效的解決由于DataTable操作引起的各種性能瓶頸。
[1]DataTable類說明[EB/OL].(2013-03-31)[2013-07024]http://msdn.microsoft.com/zh-cn/library/system.data.datatable.aspx
[2]DataRow 類說明.[EB/OL].(2013-03-31)[2013-07024]http://msdn.microsoft.com/zh-cn/library/system.data.datarow.aspx
[3]DataColu類說明[EB/OL].(2013-03-31)[2013-07024].http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.aspx
[4]劉仲博.NET DataList與ListView性能對比研究[J].科技視界,2013(11):27-28.
[5]黃有福.基于ADO.NET數據庫訪問技術及性能優(yōu)化分析[J].硅谷,2012(20):22-23.
[6]鄒蕊,葛中澤.在ASP.NET AJAX中返回DataTable到客戶端Javascript[J].電子設計工程,2011(24)47-49.
[7]王明倩,鄒紅霞,田秋艷.ASP.NET性能深度優(yōu)化的探討[J].長春師范學院學(自然科學版)報,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-),女,吉林通化人,副教授,碩士,主要從事網絡應用、數據庫應用等方面的研究。
責任編輯:
吳旭云