转自: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. IP代理

    import requests # 定义爬取url地址 base_url = 'https://www.baidu.com/' # 定义代理IP地址 proxies = {'http':'http:/ ...

  2. 4~20mA

    4~20mA电流输出芯片XTR111完整电路 0-5v转0-20ma和0-5v转4-20ma 压控恒流源电路 4-20mA电流环路发送器入门

  3. 超详细 Nginx 极简教程,傻瓜一看也会!

    什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...

  4. 通过shell查找访问日志中访问量最大的ip

    日志格式: /Sep/::: +] /Sep/::: +] /Sep/::: +] - /Sep/::: +] - /Sep/::: +] /Sep/::: +] - /Sep/::: +] /Sep ...

  5. 学习模型-视图-控制器MVC模式

    1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

  6. CSS的再深入(更新中···)

    在上一章我们提到了一个新的概念,叫做块级样式,讲到这里就要科普一下: 标签又分为两种: (1)块级标签 元素特征:会独占一行,无论内容多少,可以设置宽高··· (2)内敛标签(又叫做行内标签) 元素特 ...

  7. Golang中使用kafka

    golang中比较好用的kafka client有 sarama confluent-kafka-go go_kafka_client optiopay-kafka siesta 其中 sarama的 ...

  8. LabVIEW编程实例:如何通过TCP协议进行数据通信

    对于网络通信来说,LabVIEW平台本身提供了多种方法加以实现,如可以通过TCP协议.UDP协议.DataSocket技术.甚至远程面板通信技术等方式进行通信. 下面通过一个简单的例子,演示在LabV ...

  9. EXCEL 基本函数

    案例2:修改非法日期 TODAY(),显示今天日期,数据格式是日期,如果是常规,就是数字. EXCEL 起始日期,1900/1/1是第一天 日期输入方式要正确 时间数据格式  1:00:00  = 1 ...

  10. (转)mblog解读(一)

    (二期)11.开源博客项目mblog解读(一) [课程11]图片上传模块.xmind54.6KB [课程11]消息发...通知.xmind55.2KB [课程11]异常处理分析.xmind95.4KB ...