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很容易产生超过一个数量级的效率差异。

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