我正在开发一个使用 libxml2
处理 HTML 文档的小型阅读应用程序。在处理 HTML 树时,我检查每个 text()
节点的祖先以选择合适的样式。对于 header ,我使用以下查询来查看节点是否为 header :
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 的 Instruments,瓶颈线是:
xmlXPathObject *object = xmlXPathNodeEval(node, query, context);
我缓存 context
以加快处理速度。我还能做些什么来让它更快吗?
最佳答案
我认为您的 XPath 表达式最适合 libxml2。但似乎您没有预编译 XPath 查询。如果您在程序开始时使用 xmlXPathCompile
编译查询并使用 xmlXPathCompiledEval
对其进行评估,您应该会看到显着的加速。
最重要的是,您可以通过从查询中删除 boolean
函数并直接调用 xmlXPathCompiledEvalToBoolean
来获得小幅加速。
关于c - 使用 XPath 和 libxml2 检查祖先的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18270024/