亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ Xml解析的效率比較(Qt/TinyXml2/RapidXml)

2019-11-08 01:53:23
字體:
來源:轉載
供稿:網友

C++ xml解析的效率比較(Qt/TinyXml2/RapidXml)


C Xml解析的效率比較QtTinyXml2RapidXml問題背景測試環境Qt - QDomDocumentTinyXml-2RapidXml總結


通常我們在一些軟件的初始化或者保存配置時都會遇到對XML文件的操作,包括讀寫xml文件,解析內容等等。在我的工作中就遇到了這么一個問題,就是在ARM平臺下Qt解析xml文件非常的慢,最初懷疑是我的操作有問題或者是ARM平臺下的文件操作本身就很慢,于是就開始調查到底是哪里的效率問題,下面是一些測試分享給大家。

問題背景

下面一段代碼是前面提到的運行效率低的一段代碼:

QString filename = "...";QFile file( filename );//< step1 open fileif( !file.open(QIODevice::ReadOnly) ){ qDebug() << "failed in opening file!"; return false;}//< step2 read file contentQDomDocument 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: VC10

linux: 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>#endifusing std::cout;using std::endl;#define TEST_TIMES 10int 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();}

下面來看看windows下的運行結果: 這里寫圖片描述 當時我的反應是 WTF?? 為什么同一個函數讀同一個文件十次會有這么大的差異所以我才會在文件打開和關閉時分別都加了延時,希望避免文件開關的過程對這個函數產生的影響,結果依然沒有解決這個問題,這個問題希望有大神幫我解答一下!

那下面我們來看linux下的運行結果: 這里寫圖片描述 顯然,linux下這個時間相對的穩定可信,所以我們后面的測試也只要以linux下的時間作為參考。

TinyXml-2

下面我們來看利用tinyxml2實現讀取的源代碼:

#include <iostream>#include "tinyxml2.h"#ifdef _WIN32#include <Windows.h>#else#include <sys/time.h>#endifusing namespace tinyxml2;using std::cout;using std::endl;#define TEST_TIMES 10int 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;}

接下來先看linux下的運行結果(windows下的運行結果已經沒有太多參考價值了): linux_tinyxml_result linux下的表現依然很穩定,這里我們可以得出一個很明顯的結論,tinyxml的處理效率要比QDomDocument的處理效率高很多(這里的數據大致是4倍,但不包括對于xml文件內部信息的處理的其他函數接口的調用)。

雖然沒什么參考價值,但還是看一下windows下的測試結果: windows_tiny_result 這里效率也明顯的比Windows Qt提升很多,而且執行時間也相對穩定了一,所以前一個測試中運行時間十分不穩定的情況暫定為Qt本身實現的問題,具體是什么問題或者在高版本的Qt里面是否已解決尚無答案。

RapidXml

注:RapidXml版本: 1.13 在RapidXml Manual的介紹中可以看到它和TinyXml以及其他的一些xml解析庫做了對比(這里面tinyXml是最慢的),原文中介紹這是目前Xml解析最快的

As a rule of thumb, parsing speed is about 50-100x faster than Xerces DOM, 30-60x faster than TinyXml, 3-12x faster than pugxml, and about 5% - 30% faster than pugixml, the fastest XML parser I know of.

所以這里我也想要試試看RapidXml在內容解析時的效率表現,下面是源代碼:

#include <iostream>#include "rapidxml.hpp"#include "rapidxml_同樣,先看linux下運行的結果: linux_rapidxml_result 效率確實為 TinyXml2 的2.x倍,但是并沒有像 rapidXml 的說明手冊里說的有30~60倍的效率差異(手冊中是和TinyXml比較的,而不是TinyXml2),這里我不清楚到底是TinyXml2相對TinyXml有了明顯的效率提升還是我在RapidXml的使用上有問題,后面需要再仔細調查RapidXml的接口使用方法。 在我自己初步的使用來看,我覺得 RapidXml 的接口并有 Qt 和 TinyXml2 那么簡單易用,所以在文件大小不大或對效率要求不是很極限的情況下,使用 TinyXml2 可能會獲得開發效率和運行效率的雙贏。

再來看一下windows下的運行結果: windows_rapid_reslut 依然不是很穩定,所以只做參考。

總結

統計的時間如下(LINUX):

解析器 消耗時間(ms) 效率倍數(相對Qt)
Qt-QDomDocument 25.85 1
TinyXml2 6.64 3.89
RapidXml 2.71 9.54

工作以來基本上都是在Qt下開發,深切體會到Qt的接口封裝很完善易用,但不可避免的犧牲了一些效率(雖然沒想到效率降低了這么多),相對的,tinyxml2在接口非常相似的同時,效率也有明顯的提升(接近4倍),所以目前xml的解析還是推薦TinyXml2。后面我會繼續仔細研究TinyXml2和RapidXml的使用方法,看是否可以真正將RapidXml的性能發揮出來!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人精品一区二区三区| 午夜精品久久久久久久99热浪潮| 欧美老肥婆性猛交视频| 日韩av电影在线免费播放| 日韩精品在线免费播放| 午夜精品久久久久久久99黑人| 亚洲国产中文字幕久久网| 45www国产精品网站| 亚洲成人性视频| 国产精品久久91| 亚洲娇小xxxx欧美娇小| 亚洲国产中文字幕久久网| 亚洲综合在线中文字幕| 日韩电影中文字幕在线观看| 久久久成人精品| 国产亚洲一区二区在线| 国产成人精品免高潮在线观看| 国产日韩欧美影视| 亚洲第一精品久久忘忧草社区| 欧美日韩亚洲成人| 国产一区二区丝袜| 精品久久香蕉国产线看观看亚洲| 欧美—级a级欧美特级ar全黄| 欧美色videos| 亚洲欧美日韩中文在线制服| 性欧美亚洲xxxx乳在线观看| 国产精品视频26uuu| 一本一本久久a久久精品综合小说| 欧美日韩精品在线观看| 成人欧美一区二区三区在线| 97精品国产97久久久久久免费| 久久久久国产精品一区| 亚洲精品综合久久中文字幕| 久久久亚洲国产| 2021久久精品国产99国产精品| 欧美大片va欧美在线播放| www.日韩视频| 国产成人精品午夜| 亚洲精品wwwww| 亚洲变态欧美另类捆绑| 国产在线98福利播放视频| 国内伊人久久久久久网站视频| 精品视频在线播放| 国产精品久久久久久久久久久新郎| 欧美福利视频网站| 精品久久久久久中文字幕大豆网| 久久精品亚洲国产| 在线日韩欧美视频| 成人亚洲激情网| 97精品一区二区视频在线观看| 欧美日韩第一页| 久久亚洲精品成人| 久久精品国产99国产精品澳门| 亚洲最新中文字幕| 亚洲第一男人天堂| 美女精品久久久| 欧美尺度大的性做爰视频| 一区二区国产精品视频| 精品国产一区二区三区久久久| 亚洲石原莉奈一区二区在线观看| 精品视频偷偷看在线观看| 欧美wwwxxxx| 亚洲欧美在线一区二区| 伊人av综合网| 第一福利永久视频精品| 97久久伊人激情网| 国产精品99久久99久久久二8| 懂色av一区二区三区| 91爱爱小视频k| 国产成人精品电影久久久| 亚洲无限乱码一二三四麻| 久久久久久高潮国产精品视| 亚洲自拍欧美另类| 亚洲一区二区福利| 一本久久综合亚洲鲁鲁| 日韩免费黄色av| 色在人av网站天堂精品| 国产精品视频男人的天堂| 日本精品久久久久久久| 欧美激情久久久久久| 青青青国产精品一区二区| 日韩av手机在线| 97香蕉超级碰碰久久免费软件| 久久全球大尺度高清视频| 亚洲免费av电影| 91成品人片a无限观看| 91精品国产电影| 97免费在线视频| 伊人久久男人天堂| 亚洲视频第一页| 一区二区国产精品视频| 国产91精品久久久久久久| 欧美电影免费在线观看| 欧美日韩国产限制| 久久天堂电影网| 精品美女永久免费视频| 国产一区红桃视频| 国产精品久久久久影院日本| 福利视频一区二区| 亚洲小视频在线| 8x拔播拔播x8国产精品| 高清欧美性猛交xxxx黑人猛交| 成人精品久久一区二区三区| 欧美专区福利在线| 亚洲最大福利网| 国产精品h片在线播放| 日韩视频免费大全中文字幕| 欧美电影免费观看| 欧美噜噜久久久xxx| 日韩中文字幕视频| 国产一区二区三区精品久久久| 久久亚洲国产精品| 欧美老少配视频| 最近免费中文字幕视频2019| 欧美亚洲免费电影| 欧美电影免费观看电视剧大全| 日韩成人av在线播放| 日韩电影免费在线观看中文字幕| 韩日欧美一区二区| 在线电影av不卡网址| 国产成人精品a视频一区www| 欧美日韩亚洲91| 久久久久久综合网天天| 欧美成人中文字幕| 亚洲国产精品va在线看黑人动漫| 欧美视频中文在线看| 中文字幕视频在线免费欧美日韩综合在线看| 欧美大片大片在线播放| 国产福利成人在线| 国产成人91久久精品| 亚洲精品中文字幕女同| 欧美日韩成人网| 日韩精品在线免费观看视频| 中文字幕日韩av| 青青精品视频播放| 国产日韩专区在线| 欧美风情在线观看| 国产精品夫妻激情| 亚洲国产高潮在线观看| 国产精品99一区| 欧美日韩在线一区| 97人人爽人人喊人人模波多| 国产精品xxx视频| 国产福利精品在线| 色妞色视频一区二区三区四区| 欧美风情在线观看| 欧美国产精品人人做人人爱| 亚洲女人天堂色在线7777| 91豆花精品一区| 欧美专区在线视频| 欧美孕妇毛茸茸xxxx| 欧美性猛交xxxx偷拍洗澡| 国产精品视频公开费视频| 欧美精品久久久久久久免费观看| 日韩有码在线视频| 亚洲影视九九影院在线观看| 久久精品美女视频网站| 91精品在线一区| 亚洲国产精品视频在线观看| 久久免费高清视频| 日本三级久久久| 国产福利精品视频| 在线视频欧美日韩| 在线视频国产日韩|