Home > 程序/算法 > SlimXml和TinyXml,RapidXml的性能对比

SlimXml和TinyXml,RapidXml的性能对比

前两天有朋友问,我的SlimXml有没有和RapidXml对比过效率?我是第一次听说这个库,更不用说对比效率了,于是上他们网站看了下。

好家伙,居然号称比TinyXml快30~60倍,而且是Boost.PropertyTree的默认xml解析器。

于是有点好奇,因为以前也没有特别关心过SlimXml的效率。

于是分别下载了TinyXml-2.6.1和RapidXml-1.13,迅速用vc8建立了两个测试工程,在系统中搜”*.xml”,找到了一个比较合适的测试文件。它足够大(1.5M),utf-8编码并且包含中/英文,有一定层次深度,大约3.3万行。测试文件可以从这里下载

测试对象是三个库从内存字符串解析xml的函数,这样能排除从硬盘上读文件这种不稳定因素的干扰,而且RapidXml貌似只支持从内存里解析

  • slim::XmlDocument::loadFromMemory()
  • TiXmlDocument::Parse()
  • rapidxml::xml_document<char>::parse<flag>()

要说明的是,RapidXml的这个parse是一个模板函数,必须给一个flag的参数,我测试的时候给的是默认的0

测试结果,解析这个3.3万行,1.5M大小的xml,三个库分别花了

  • SlimXml:    22ms
  • TinyXml:    54ms
  • RapidXml: 4ms!

结论是,RapidXml果然很强悍,居然比我的SlimXml快5倍多。但是并没有如作者所说比TinyXml快30~60倍,只有不到15倍。据说对比用的是一个约50k大小的xml文件,可惜并没有提供下载,不然可以验证一下。

比较欣慰的是,在我并没有很关注效率的情况下,SlimXml仍然比TinyXml快2.5倍。SlimXml走的是简单小巧路线,源代码只有32k,而TinyXml和RapidXml的源码分别是147k和141k,有这样的效率可以满意了。在我有很多空闲以前,估计我也不会再去优化它,因为这个库主要还是针对几十上百行的小文件,解析特别大的xml不在我考虑的范围之内。

以下是RapidXml提供的常见xml库效率对照表,其中还很牛鼻地提供了和strlen()函数的效率对比

我估计RapidXml速度快的主要原因是对memory pool的使用,毕竟在解析过程中需要创建大量的string,可以想象用memory pool和直接走默认的new很容易产生超过一个数量级的效率差异。

Categories: 程序/算法 Tags:
  1. July 22nd, 2010 at 16:23 | #1

    路过,帮顶~.我还没有测试我的xml解析器..呵呵,不过我也用了memory pool,呃..是我的string类本身用了memory pool.

Spam Protection by WP-SpamFree