前一段時間寫了一個用xml作爲數據儲存方式的站點,感覺速度很慢。經過測試發現,原來大量的時間用來處理在網絡上的dtd文件了。進而又對xml數據讀取的性能進行了進一步的測試。
測試分爲3種類型,分別是讀取單條數據、讀取前n條數據、讀取n到m條數據的測試。這些都是網站最基本的取數據的方式。對5種類型的數據進行測試,分別爲dtd在網絡上的xml(本機web服務器)、dtd在文件系統中的xml、不包含dtd的xml、sql server 2000、access。
測試數據
xml的數據結構如以下dtd所描述:
<?xml version="1.0" encoding="gb2312" ?>
<!--產品-->
<!ELEMENT product ( class, intro, image, price, content ) >
<!--
id 產品唯一標誌
name 產品名稱
-->
<!ATTLIST product id ID #REQUIRED
name CDATA #REQUIRED >
<!--產品類別-->
<!ELEMENT class ( #PCDATA ) >
<!--介紹-->
<!ELEMENT intro ( #PCDATA ) >
<!--產品圖片-->
<!ELEMENT image ( #PCDATA ) >
<!--產品單價-->
<!ELEMENT price ( #PCDATA ) >
<!--產品詳細介紹-->
<!ELEMENT content ( #PCDATA ) >
測試使用DOM模型讀取xml,當讀取多條記錄時先列出所有xml文件,然後再選擇一部分構造DOM對象,代碼如下:
XmlDocument [] docs = new XmlDocument[ loop ];
string [] files = Directory.GetFiles( @"D:/Temp/XmlLoadTester/TestData/public" );
int end = start + num;
for( int j = start; j < end; j ++ )
{
XmlDocument xml = new XmlDocument();
xml.Load( files[j] );
docs[j] = xml;
}
每一組測試數據都包含77個xml文件。
sql server與access使用的數據表爲sql server自帶的nothwind數據庫中的products表(其中access中的表結構及數據均爲sql server導出)。分別使用SqlClient和OleDb進行數據庫連接,使用DataApater將數據填充到DataTable中。取出n條數據的時候使用的是sql語句中的top n,取出n到m條記錄的時候使用的是如下sql語句:
"select top " + (m-n) + " * from products where productid not in ( select top " + n + " productid from products order by productid ) order by productid"
數據表中有77條記錄。
測試環境
硬件:amd Sempron 2800+(超頻到1.9GHZ),onda N61G,512M ddr 400,7200prm 40g pata
軟件:windows 2003 server, sql server 2000, iis6.0, .net framework 1.1
測試結果
下表是這次測試的結果(單位:秒):
|
連續讀取一條記錄1000次 |
讀取15條記錄100次 |
讀取15條記錄1000次 |
讀取40條1000次 |
讀取30條到45條記錄1000次 |
讀取60條到75條記錄1000次 |
dtd在網絡中的xml |
11.734 |
22.015 |
193.515 |
469.984 |
179.406 |
同左 |
dtd在文件系統中的xml |
4.125 |
7.968 |
79 |
187.968 |
74.437 |
同左 |
不包含dtd的xml |
0.953 |
3.125 |
31.312 |
52 |
29.609 |
同左 |
SqlServer |
1.187 |
0.125 |
1.406 |
1.781 |
1.312 |
1.359 |
Accesss |
37.250 |
3.781 |
37..406 |
48.265 |
51.125 |
1:03.328 |
從測試結果來看,處理dtd會對性能產生嚴重影響。不過不包含dtd的xml的性能明顯已經超過access。使用xml在中小型站點上替代access是完全可行的。
測試中的一些問題
1.cpu佔用率:讀取xml的時候cpu佔用率一直爲100%。sql server的cpu佔用率也很高,不過很快數據讀取就結束了。access是cpu佔用率最低的,最複雜的操作也不會達到30%。如果從cpu效率來說的話,xml恐怕是最低的了。
2.dtd緩存:在讀取dtd在網絡中的xml時,cpu佔用率一直不穩定,如下圖所示:
我覺得可能是.net對dtd有緩存,過一段時間後緩存就失效了,然後再到網絡上取一次dtd。
3.獲取文件列表的問題:因爲擔心數據條數多的時候列出文件列表會另性能降低,所以額外對列出文件作了測試,測試代碼如下:
for( int i = 0; i < 1000; i++ )
{
string [] files = Directory.GetFiles( dir );
}
奇怪的是當dir是包含xml數據的文件夾時(含77個文件),這段代碼運行了19秒,而列出c:/window/system32目錄下的文件時(2500+個文件)時,只用了12秒多一點。難道是windows對這個文件夾作優化了,還是別的原因?我又將xml數據複製到一個新建文件夾中,複製了837份,結果列出這個文件夾的文件也只用了12.9秒。難道文件越多列出的時間用的越少?不過至少證明了在文件很多的情況下用xml的性能也不會降低很多。