C++ Xml解析的效率比较(Qt/TinyXml2/RapidXml/PugiXml)
通常我们在一些软件的初始化或者保存配置时都会遇到对XML文件的操作,包括读写xml文件,解析内容等等。在我的工作中就遇到了这么一个问题,就是在ARM平台下Qt解析xml文件非常的慢,最初怀疑是我的操作有问题或者是ARM平台下的文件操作本身就很慢,于是就开始调查到底是哪里的效率问题,下面是一些测试分享给大家。
问题背景
下面一段代码是前面提到的运行效率低的一段代码:
QString filename = "...";
QFile file( filename );
//< step1 open file
if( !file.open(QIODevice::ReadOnly) )
{
qDebug() << "failed in opening file!";
return false;
}
//< step2 read file content
QDomDocument doc; //< #include <qdom.h>
if( !doc.setContent( &file ) )
{
qDebug() << "failed in setting content!";
file.close();
return false;
}
file.close();
... //< operations on the content of file!
起初以为是文件打开和关闭耗时太多,所以在文件open和close函数前后都获取了系统时间来测试了函数消耗时间,结果是耗时很短,反而是 doc.setContent
耗费了非常长的时间,这才发现原来是Qt获取XML文件内容且Dom模型结构花费了太多时间,所以我们开始寻求效率更高的解决方案。
测试环境
Windows:
system:windows 10
cpu: intel core-i5-5200u @2.2GHz
IDE: visual studio 2010
compiler: VC10Linux:
system: Debian 4.4.5-8
cpu: intel core-i5-3450 @3.3GHz
IDE: VIM
compiler: gcc version 4.4.5
- Qt版本: 4.8.4
- 用来测试的文件名为 DriverConfig.xml,大小为245Kb,共1561行,大部分内容为中文
- 比较项有 TinyXml2, QDomDocument,因为从接口来看这两者的操作方式很类似,后面我会加入其它的xml解析库的比较,如 xmlbooster 等。
Qt - QDomDocument
下面是利用Qt中的xml支持来读取文件内容的源代码:
#include <QtCore/QCoreApplication>
#include <qdom.h>
#include <QFile>
#include <QIODevice>
#include <iostream>
#ifdef Q_OS_WIN
# include <Windows.h>
#else
# include <sys/time.h>
#endif
using std::cout;
using std::endl;
#define TEST_TIMES 10
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
#ifdef Q_OS_WIN //< windows
long tStart = 0;
long tEnd = 0;
LARGE_INTEGER nFreq;
LARGE_INTEGER nStartTime;
LARGE_INTEGER nEndTime;
double time = 0.;
QueryPerformanceFrequency(&nFreq);
QFile file( "D:/DriverConfig.xml" );
QDomDocument doc;
for( int i = 0; i < TEST_TIMES; ++i )
{
doc.clear();
//< step1 open file
if( !file.open(QIODevice::ReadOnly) )
{
cout << "failed to open file!" << endl;
continue;
}
Sleep( 100 );
QueryPerformanceCounter(&nStartTime);
//< step2 set content
if( !doc.setContent(&file) )