2013-08-16 59 views
1

我正在研究使用libxml2處理HTML文檔的小型閱讀應用程序。在處理HTML樹時,我會檢查每個text()節點的祖先,以選擇合適的樣式。對於頭我使用查詢以下看到一個節點是否是頭或不:使用XPath和libxml2檢查祖先的最快方法

boolean(ancestor::*[ 
self::h1 or 
self::h2 or 
self::h3 or 
self::h4 or 
self::h5 or 
self::h6]) 

隨着5 MB的書,它需要1.1秒通過。再加上兩個額外的重點查詢和代碼樣式(具有更多的節點名稱集合),它可以達到4.4秒。

根據蘋果的儀器,瓶頸行是:

xmlXPathObject *object = xmlXPathNodeEval(node, query, context); 

我緩存context加快速度。還有什麼我可以做得更快?

回答

2

我認爲您的XPath表達式對於libxml2是最佳的。但似乎您不會預編譯XPath查詢。如果您在程序開始時使用xmlXPathCompile編譯查詢,並使用xmlXPathCompiledEval對其進行評估,則應該看到顯着的加速。

最重要的是,您可以通過從查詢中刪除boolean函數並直接調用xmlXPathCompiledEvalToBoolean來獲得較小的加速。

+0

哇,謝謝你的提示!非常有用和關鍵。 –