tinyxml優化之一

2022-02-24 04:39:03 字數 1877 閱讀 1732

最近在搞xml解析優化,公司引擎用了tinyxml1和tinyxml2兩個xml庫,後者的效率比前者高60%吧,tinyxml1解析大檔案是很慢的,可以淘汰了,tinyxml2還勉強,快的話還得算pugixml或者rapidxml吧。

奈何一些引擎**根深蒂固,無法更換為pugixml,只能區域性修改一下tinyxml庫的源**企圖優化一下

今天在優化的時候碰到乙個坑,就是解析出錯的時候,xml庫是如何處理的,比如某個節點有兩個同名的屬性,以下是各xml庫的處理:

tinyxml1:按xml文字的順序解析,在解析到同名屬性的時候,停止解析,返回已經解析好了的那部分,並且在document物件裡的 errorlocation.row 和 errorlocation.col 表明出錯的位置(行和列)

tinyxml2:貌似是遞迴解析,碰到同名屬性時,一下子全蹦了,返回的document啥子都沒有,在document物件裡的 _errorstr1 裡儲存了那個同名的屬性的名字, _errorstr2 指向那個同名屬性後的位置。其實不是很好分辨

pugixml:非常高效,所以沒看懂是如何解析的。在給element新增屬性時應該是沒有見檢查是否存在同名屬性,能正常解析完的,最後斷點觀察那兩個同名屬性都被加進了element的

解析比較:tinyxml1使用的是逐字元掃瞄,tinyxml2使用的劃分成塊解析吧,pugixml沒看懂。除了解析的方式不同造成效率有差別之外,另外乙個重要的原因則是字串的操作了;還有乙個就是冗餘的安全性檢查,效率和安全總是對立的。。

tinyxml1:區分是否使用了stl巨集,如果使用了,裡面的字串都是使用sdt::string型別,否則就是用自定義的乙個字串類 tinystr。把xml檔案讀取到記憶體後,在解析的時候,每涉及到字串操作時,比如設定屬性的名字、屬性等,都會有分配記憶體然後把字串拷貝過來賦值(如果使用了stl則由stl::string負責記憶體的分配和管理) 。乙個xml檔案裡有n多的節點、m的屬性、非常多的字串,每次都要分配記憶體、拷貝,慢是必然的了。每一次新增節點或者屬性時,都會進行檢查是否已有同名的節點或者屬性。

tinyxml2:使用了自定義的字串類 strpair 。xml檔案被讀取到記憶體後,tinyxml2會分配記憶體(假設是a記憶體)把xml檔案的內容拷貝過來,在解析的時候,涉及到xmlelement或者xmlattribue等之外的name、value的時候,tinyxml2並沒有再次分配記憶體把字串拷貝過去,而是把strpair的 _start 指標 直接指向a記憶體裡對應的位置,整個過程,只分配了一次記憶體~~ 解析完了之後,如果你新增了節點或者更改某屬性的value等等時,tinyxml2則會分配新的記憶體,strpair類裡有標記位來分辨是第一次解析還是後面的增加或者修改的。每一次新增節點或者屬性時,都會進行檢查是否已有同名的節點或者屬性。

pugixml:貌似是自己負責了所有的記憶體管理,沒太看懂~~每一次新增節點或者屬性時,應該沒有進行檢查是否已有同名的節點或者屬性~~

今天被坑在,某個xml檔案某個節點有屬性同名了,但引擎庫是用了tinyxml1來解析的,所以返回的document的全半部分是正常的,而我是用tinyxml2來測試的優化**的,發現~~~被坑大了,各種檢查自己寫的優化的**~~~ 

剛好還發現那個xml檔案裡有中文,搞得又懷疑是編碼的問題,順便又惡補了一下編碼的基礎知識,順便用了用比較了一下 sublime text、notepad++、ultraedit~~~發現ultraedit是用unicode編碼來顯示的,對於黏貼進去的字串會當成是unicode編碼格式下的來處理;sublime text 可以用utf8、大頭小頭unicode-16、16進製制等編碼格式來顯示,對於拷貝進去的字串,會被當做是utf8編碼格式下的來處理;notepad++ 可以用 ansi、utf8等編碼格式來顯示,對於拷貝進去的字串,看你當前選擇了什麼格式,你選擇了什麼格式,拷貝進去的字串就會當作那個編碼格式下的來處理。

擦,都得又亂了,雖然原本也沒清楚。。苦逼

SQL優化之一

在sqlserver2008 management studio中執行下列 set statistics time on goselect from information.lhbinfo where tradingdate between 2010 01 01 and 2011 06 10 god...

說Oracle優化之一

今年所做的優化,大的涉及到體系架構改造,通過cache來減少sql執行次數,通過更改應用的實現方式等,小的如加hint,建索引等等,大大小小快接近上百個了,如何來做優化,這邊我稍微闡述一下。1.紮實的基本功 資料庫最基本的理論要清楚,要理解的透徹一點。比如索引為什麼有些塊delete後不能重用,而表...

JDBC優化技巧之一

以下是一些常用的jdbc小技巧,也許可以提高你的系統的執行速度。1.當使用preparedstatement callablestatement時,盡量使用它提供的setparams的方法。下面是錯誤的方法 callablestatement cstmt conn.preparecall resul...