前一段时间写了一个用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 |