xml与access数据读取对比测试
2006-06-13 14:00
441 查看
前一段时间写了一个用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
测试结果
下表是这次测试的结果(单位:秒):
从测试结果来看,处理dtd会对性能产生严重影响。不过不包含dtd的xml的性能明显已经超过access。使用xml在中小型站点上替代access是完全可行的。
测试中的一些问题
1.cpu占用率:读取xml的时候cpu占用率一直为100%。sql server的cpu占用率也很高,不过很快数据读取就结束了。access是cpu占用率最低的,最复杂的操作也不会达到30%。如果从cpu效率来说的话,xml恐怕是最低的了。
2.dtd缓存:在读取dtd在网络中的xml时,cpu占用率一直不稳定,如下图所示:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lxfan/temp.jpg)
我觉得可能是.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的性能也不会降低很多。
测试分为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 |
测试中的一些问题
1.cpu占用率:读取xml的时候cpu占用率一直为100%。sql server的cpu占用率也很高,不过很快数据读取就结束了。access是cpu占用率最低的,最复杂的操作也不会达到30%。如果从cpu效率来说的话,xml恐怕是最低的了。
2.dtd缓存:在读取dtd在网络中的xml时,cpu占用率一直不稳定,如下图所示:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/lxfan/temp.jpg)
我觉得可能是.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的性能也不会降低很多。
相关文章推荐
- [导入]xml与access数据读取对比测试
- FIFO和Binder读取数据效率测试对比结果
- 自动化测试数据驱动之xml文件读取
- 通过读取excel数据和mysql数据库数据做对比(二)-代码编写测试
- MySql,PostgreSql,SqlServer数据写入读取速度对比测试
- 从数据库中读取XML数据
- Ajax 动态(asp程序)无刷新读取(xml)数据
- C# XML操作之读取XML数据
- SQLServer 读取XML类型的节点数据
- 测试从kafka读取数据到sparkstreaming是遇到以下这个错误
- 数据测试读取和传输问题
- python 接口测试response返回数据对比的方法
- Android之读取 AndroidManifest.xml 中的数据
- 读写xml所有节点个人小结 和 读取xml节点的数据总结
- ASP.NET+ExtJs4.0+Ajax+读取xml数据+读取json数据
- c++ 使用TinyXML 读取xml数据
- titanium.cookbook-02-01-使用HTTPClient对象从远程XML读取数据
- 使用 XMLHttpRequest 读取 XML 数据
- C#读取XML文件数据和把数据保存至xml的方法
- 【数据存储】——JSON与XML的对比