我正在开发一个使用libxml2
处理HTML文档的小型阅读应用程序。在处理HTML树时,我会检查每个text()
节点的祖先,以选择合适的样式。对于标头,我使用以下查询来查看节点是否为标头:
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秒。
根据Apple的仪器,瓶颈线是:
xmlXPathObject *object = xmlXPathNodeEval(node, query, context);
我缓存context
以加快速度。还有什么我可以做的让它更快吗?
答案 0 :(得分:2)
我认为你的XPath表达式对于libxml2来说是最佳的。但似乎您没有预编译XPath查询。如果您在程序开始时使用xmlXPathCompile
编译一次查询并使用xmlXPathCompiledEval
进行评估,那么您应该会看到显着的加速。
最重要的是,您可以从查询中删除boolean
函数并直接调用xmlXPathCompiledEvalToBoolean
来获得较小的加速。