转自:http://www.itdaan.com/blog/2017/02/20/301ad47832f4.html

由于windows环境下测试不稳定,博主选择在linux下进行的测试!

Qt - QDomDocument

#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) )
{
cout << "Failed to read xml file!" << endl;
}
QueryPerformanceCounter(&nEndTime);
time = (double)(nEndTime.QuadPart-nStartTime.QuadPart) / (double)nFreq.QuadPart * 1000.; //< ms
cout << " seting content costs " << time << "ms" << endl; file.close();
Sleep( 100 );
} #else //< LINUX timeval starttime, endtime;
QFile file( "/home/liuyc/DriverConfig.xml" );
QDomDocument doc;
double timeuse = 0.;
double timeAverage = 0.; 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( 1 ); //< delay for 1s
gettimeofday( &starttime, 0 ); //< step2 set content
if( !doc.setContent(&file) )
{
cout << "Failed to read xml file!" << endl;
continue;
}
gettimeofday( &endtime, 0 );
timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;
timeuse *= 0.001 ;
timeAverage += timeuse;
cout << " reading files costs : " << timeuse << "ms" << endl; file.close();
sleep( 1 ); //< delay for 1s
} timeAverage /= TEST_TIMES;
cout << " The End *****************\n average costs = " << timeAverage << "ms" << endl; #endif return a.exec();
}

  

TinyXml-2

#include <iostream>
#include "tinyxml2.h"
#ifdef _WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#endif
using namespace tinyxml2;
using std::cout;
using std::endl; #define TEST_TIMES 10 int main()
{
#ifndef _WIN32 //< linux ------------------------------------------------ tinyxml2::XMLDocument doc;
timeval starttime, endtime;
double timeuse = 0.;
double timeAverage = 0.;
for( int i = 0; i < TEST_TIMES; ++i )
{
gettimeofday( &starttime, 0 );
if( XML_SUCCESS != doc.LoadFile( "/home/liuyc/DriverConfig.xml" ) )
{
cout << "failed in load xml file! _ " << i << endl;
continue;
}
gettimeofday( &endtime, 0 ); timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;
timeuse *= 0.001 ;
cout << " reading files costs : " << timeuse << "ms" << endl;
timeAverage += timeuse;
}
timeAverage /= TEST_TIMES;
cout << " \n** The end *******************\n the average costs = " << timeAverage << "ms" << endl; #else //< windows --------------------------------------------------- LARGE_INTEGER nFreq;
LARGE_INTEGER nStartTime;
LARGE_INTEGER nEndTime;
double time = 0.; QueryPerformanceFrequency(&nFreq);
tinyxml2::XMLDocument doc;
for( int i = 0; i < TEST_TIMES; ++i )
{
QueryPerformanceCounter(&nStartTime);
if( XML_SUCCESS != doc.LoadFile( "D:/DriverConfig.xml" ) )
{
cout << "failed in load xml file! _ " << i << endl;
continue;
}
QueryPerformanceCounter(&nEndTime);
time = (double)(nEndTime.QuadPart-nStartTime.QuadPart) / (double)nFreq.QuadPart * 1000.; //< ms
cout << " reading files costs : " << time << "ms" << endl;
}
cout << endl;
system("pause"); #endif //< end of windows ---------------------------------------------------
return 0;
}

  

RapidXml

RapidXml版本: 1.13

#include <iostream>
#include "rapidxml.hpp"
#include "rapidxml_print.hpp"
#include "rapidxml_utils.hpp"
#ifdef _WIN32
# include <Windows.h>
#else
# include <sys/time.h>
#endif using namespace rapidxml;
using std::cout;
using std::endl; #define TEST_TIMES 10 int main()
{
#ifdef _WIN32 //< windows LARGE_INTEGER nFreq;
LARGE_INTEGER nStartTime;
LARGE_INTEGER nEndTime;
double time = 0.;
QueryPerformanceFrequency(&nFreq); //< parse xml
for( int i = 0 ; i < TEST_TIMES; ++i )
{
rapidxml::file<> filename( "D:/DriverConfig.xml" );
xml_document<> doc;
QueryPerformanceCounter(&nStartTime); doc.parse<0>( filename.data() ); QueryPerformanceCounter(&nEndTime);
time = (double)(nEndTime.QuadPart-nStartTime.QuadPart) / (double)nFreq.QuadPart * 1000.; //< ms
cout << " reading files costs : " << time << "ms" << endl;
doc.clear();
} system("pause"); #else timeval starttime, endtime;
double timeuse = 0.;
double timeAverage = 0.; //< parse xml
for( int i = 0 ; i < TEST_TIMES; ++i )
{
rapidxml::file<> filename( "/home/liuyc/DriverConfig.xml" );
xml_document<> doc;
gettimeofday( &starttime, 0 ); doc.parse<0>( filename.data() ); gettimeofday( &endtime, 0 ); timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;
timeuse *= 0.001 ;
cout << " reading files costs : " << timeuse << "ms" << endl;
doc.clear(); timeAverage += timeuse;
}
timeAverage /= TEST_TIMES;
cout << " \n** The end *******************\n the average costs = " << timeAverage << "ms" << endl; #endif return 0;
}

  

PugiXml

#include <iostream>
#include "pugixml.hpp"
#include "pugiconfig.hpp"
#include <sys/time.h>
using namespace std; #define TEST_TIMES 10 int main( void )
{
pugi::xml_document doc;
timeval starttime, endtime;
double timeuse = 0.;
double timeAverage = 0.;
for( int i = 0; i < TEST_TIMES; ++i )
{
gettimeofday( &starttime, 0 );
if( !doc.load_file( "/home/liuyc/DriverConfig.xml" ) )
{
cout << "failed in load xml file! _ " << i << endl;
continue;
}
gettimeofday( &endtime, 0 ); timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;
timeuse *= 0.001 ;
cout << " reading files costs : " << timeuse << "ms" << endl;
timeAverage += timeuse;
}
timeAverage /= TEST_TIMES;
cout << " \n** The end *******************\n the average costs = " << timeAverage << "ms" << endl;
return 0;
}

  

总结

统计的时间如下(LINUX):

解析器 消耗时间(ms) 效率倍数(相对Qt)
Qt-QDomDocument 25.85 1
TinyXml2 6.64 3.89
RapidXml 2.71 9.54
pugixml 1.57 16.47

[转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml的更多相关文章

  1. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  2. NSXMLParser自定义的一个xml解析工具

    // // DenglXMLParser.h // #import <Foundation/Foundation.h> @interface DenglXMLParser : NSXMLP ...

  3. xml解析工具-jdom

    前言:近期接触SSH框架的时候,经常得配置一下xml文件:今天闲来没事就挖挖xml解析的原理供大伙儿分享.本文主要通过一个简单的例子解析一个xml文件.明白其中缘由之后,大家想定义自己的xml也绝非难 ...

  4. XML解析工具类

    public class XmlUtil { /* * 利用dom4j解析xml文件内容,并返回map数据形式 * path是.xml文件所在的路径 */ public static Map<S ...

  5. xml解析工具mashaller javaee自带解析类

    1.怎样去掉Marshaller的格式化? : JAXBContext context = JAXBContext.newInstance(Entity.class); Marshaller mars ...

  6. Java -- XML解析工具dom4j

    前言 XML现已成为一种通用的数据交流方式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便,对于XML的解析有四种方式:DOM生成和解析XML文档,SAX生成和解析XML文件 ...

  7. java自带的xml解析工具类

    public class JaxbUtil { /** * java对象转换为xml文件 * * @param xmlPath xml文件路径 * @param load java对象.Class * ...

  8. Android 简易XML解析

    首先创建在Android工程中创建一个Assets文件夹 app/src/main/assets 在这里添加一个名为 data.xml的文件,然后编辑这个文件,加入如下XML格式内容 <?xml ...

  9. UI进阶 解析XML 解析JSON

    1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSO ...

随机推荐

  1. 用Java实现MVPtree——MVPtree点集内去重以及衍生出来的多维向量Hash问题

    上次完成了MVPtree之后,客户又提出了MVPtree点集元素重复的问题,希望我将元素去重. 集合去重哪家强?java.util找HashSet!如果不计较元素顺序,放进去基本就没有重复元素了. 只 ...

  2. Bootstrap表单样式

    <form class="form-horizontal" role="form"> <fieldset> <legend> ...

  3. daemon进程fork一次和fork两次的区别?

    守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊的进程.它独立于控制终端并且周期性的执行某种任务负等待处理某些发生的事件.因为他们没有控制终端,所以说他们是在后台运行的. 守护进程的特点 ...

  4. linux 文件 md5校验

    为解决官方发布的软件包被别人更改或者软件在传输过程中出现传输错误等问题,软件官方在提供软件包的同时,还提供一个保存MD5校验码的文件. Linux/unix中可以使用命令 # md5sum 文件名 方 ...

  5. tomcat日志警告WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did not find a matching property.

    日志中有警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did ...

  6. LINUX学习 - 磁盘分区 + 开机自动挂载 + 性能测试

    在看鸟哥linux私房菜,发现不少有趣的东西,真是相见恨晚. 情境:建立一个新的filesystem挂在/srv/myproject目录下,并让其开机自动挂载到目录,该目录给project群组共享,其 ...

  7. Spring <import>标签配置

    使用情景:在Maven项目中,我们在Spring 配置文件中需要用到<import resource="">标签来引入其他配置文件,这里我要记下一些注意事项 情景1 & ...

  8. ODAC(V9.5.15) 学习笔记(十一)TOraEncryptor、TOraPackage和TOraAlerter

    TOraEncryptor 名称 类型 说明 DataHeader TCREncDataHeader 一些附加信息放入加密数据中,包括: ehNone 无附加信息 ehTag   GUID和随机生成的 ...

  9. RPMB分区介绍【转】

    本文转载自:https://blog.csdn.net/xiezhi123456/article/details/81479793 RPMB(Replay Protected Memory Block ...

  10. 【安装】Redis4.0.10在Linux环境搭建

    1.下载Redis后上传到指定目录 2.解压 tar -zxvf redis-4.0.10.tar.gz 3.进入加压后的目录并编译 cd redis-4.0.10 make 4.进入src目录安装 ...