c - 使用 XPath 和 libxml2 检查祖先的最快方法

标签 c xml performance xpath libxml2

我正在开发一个使用 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/

相关文章:

java - JNI : Converting C Function To Java Style Function

java - Servlet 从 web.xml 初始化数据库参数

java - 不幸的是停止了这个应用程序

在c中使用atof将字符串转换为double

c - 基本凯撒法典;加密字符串。请解释我做了什么:D

c - 读取音频rlp

java - 如何在 Groovy 中将 XML 转换为对象并插入到 MongoDB 集合中?

perl - 如何在重负载下对 IO 绑定(bind)的 Perl Web 应用程序进行基准测试和分析?

Java 套接字在 LAN 上工作,但不能在 Internet 上工作?

python - 比较 python 中 Gigantic Two Dimen 列表中一个列表的值,最快的方法?