1

我正在开发一个使用libxml2. 在处理 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 秒。

根据苹果的 Instruments,瓶颈线是:

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

我缓存context以加快速度。我还能做些什么来让它更快吗?

4

1 回答 1

2

我认为您的 XPath 表达式最适合 libxml2。但似乎您没有预编译您的 XPath 查询。如果您xmlXPathCompile在程序开始时使用一次编译查询并使用 评估它xmlXPathCompiledEval,您应该会看到显着的加速。

boolean最重要的是,您可以通过从查询中删除函数并直接调用来获得小幅加速xmlXPathCompiledEvalToBoolean

于 2013-08-22T13:51:31.070 回答