xml與access數據讀取對比測試

    前一段時間寫了一個用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

讀取401000

讀取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的性能也不會降低很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章