近來找到乙個快速的xml庫,試用了一下,方法和現在使用的tinyxml差不多,很容易上手,如果有機會可以移植到專案裡面試試
自從用了xml後對他是又愛又恨,他的確能代替配置檔案,但是當檔案容量大到一定量的時候災難就降臨了,比如讀取乙個50m的xml檔案,往往讀取花上10秒,解析再花上20秒,還要占用大量記憶體空間,十分頭痛.所以實際專案中都會將xml再轉為二進位制檔案來處理,但是xml的靈活性的確很方便,如果rapidxml能接近二進位制的速度,當然就太好啦,還沒有測試過,下面是一些介紹.
貌似tinyxml會遇到unicode障礙,rapidxml不會,如果專案要做多語言版本就必須面臨解決這個問題...
rapidxml是乙個快速的xml庫,官方**:
根據manual看到,他竟然比tinyxml快了50-100倍
目前我公司開發的nexus engine的底層物件序列化使用了tinyxml來讀寫xml檔案。tinyxml有兩個不爽的地方,一是它的介面使用file*,另外乙個是它對 wchar_t不能很好的支援。前陣子看boost庫的更新中多了乙個propertytree,他在處理xml時用到了另外乙個小的庫 –rapidxml。既然間接的是boost庫的一部分,所以是值得一試的。於是找到其官方**(
首先就是速度,據它自己宣稱比tinyxml快30到60倍,比xerces dom快50到100倍!詳細的測試比較請見其使用者手冊(manual.html
)的「4. performance 」一節。
其次它的設計非常的簡潔,只依賴於標準庫中的幾個基本的類。它的輸入輸出都是字串,這樣很好,乙個庫就應該關注自己核心的內容,做盡量少的事情。它的api其實和tinyxml倒是有幾分相似,用過tinyxml的人應該很容易上手:
tinyxml主要介面類 rapidxml的主要介面類
tinyxml主要介面類rapidxml的主要介面類
class tixmldocument
template
class xml_document
class tixmlnode
template
class xml_node
class tixmlattribute
template
class xml_attribute
下面還是看乙個具體的例子來體驗一下,下面是tinyxml官方教程中建立xml文件的一段**:
void build_******_doc( )下面是使用rapidxml實現類似功能的**:
string text;
rapidxml::print(std::back_inserter(text), doc, 0);
// write text to file by yourself}
下面是使用rapidxml分析xml的樣例**:
void parse_doc_by_rapidxml(char* xml_doc)
前兩天有朋友問,我的slimxml
有沒有和rapidxml
對比過效率?我是第一次聽說這個庫,更不用說對比效率了,於是上他們**看了下。
好傢伙,居然號稱比tinyxml
快30~60倍,而且是boost.propertytree
的預設xml解析器。
於是有點好奇,因為以前也沒有特別關心過slimxml的效率。
測試物件是三個庫從記憶體字串解析xml的函式,這樣能排除從硬碟上讀檔案這種不穩定因素的干擾,而且rapidxml貌似只支援從記憶體裡解析
要說明的是,rapidxml的這個parse是乙個模板函式,必須給乙個flag的引數,我測試的時候給的是預設的0
測試結果,解析這個3.3萬行,1.5m大小的xml,三個庫分別花了
比較欣慰的是,在我並沒有很關注效率的情況下,slimxml仍然比tinyxml快2.5倍。slimxml走的是簡單小巧路線,源**只有32k,而tinyxml和rapidxml的原始碼分別是147k和141k,有這樣的效率可以滿意了。在我有很多空閒以前,估計我也不會再去優化它,因為這個庫主要還是針對幾十上百行的小檔案,解析特別大的xml不在我考慮的範圍之內。
以下是rapidxml提供的常見xml庫效率對照表,其中還很牛鼻地提供了和strlen()函式的效率對比
rapidxml,乙個快速的xml庫
近來找到乙個快速的xml庫,試用了一下,方法和現在使用的tinyxml差不多,很容易上手,如果有機會可以移植到專案裡面試試 自從用了xml後對他是又愛又恨,他的確能代替配置檔案,但是當檔案容量大到一定量的時候災難就降臨了,比如讀取乙個50m的xml檔案,往往讀取花上10秒,解析再花上20秒,還要占用...
就乙個快速排序。。。
話說,每次寫題的時候我都是呼叫stl的sort,自己卻還是很難快速寫出乙個快排。正好作業布置這個了。就寫一下,熟練一下,順便背一下記住。萬一以後面試問到了,也可以秒了。include include include using namespace std const int maxn 10000 5...
快速操作乙個list
取出list物件中的某個屬性,放在另乙個list中 把list中的資料轉為字串,用,號分隔 long userarray long convertutils.convert userids.split long.class 獲取單個 dbdictionary dictionary list.stre...