XML解析器/验证器的算法复杂性

时间:2020-03-05 18:44:15  来源:igfitidea点击:

我需要知道不同XML工具(解析器,验证器,XPath表达式评估器等)的性能如何受到输入文档的大小和复杂性的影响。那里是否有资源记录了CPU时间和内存使用如何受到……的影响,嗯?文档大小以字节为单位?节点数?关系是线性的,多项式的或者更差的吗?

更新

在2008年9月IEEE电脑杂志第41卷第9期的一篇文章中,作者调查了四种流行的XML解析模型(DOM,SAX,StAX和VTD)。他们运行了一些非常基本的性能测试,这些测试表明,当输入文件的大小从1-15 KB增加到1-15 MB或者大大约1000倍时,DOM分析器的吞吐量将减半。其他模型的吞吐量没有受到明显影响。

不幸的是,他们没有进行更详细的研究,例如吞吐量/内存使用量与节点数量/大小的关系。

文章在这里。

更新

我无法找到对此问题的任何正式处理。对于它的价值,我进行了一些实验,以XML文档大小(以字节为单位)的函数来测量XML文档中的节点数。我正在仓库管理系统上工作,而XML文档是典型的仓库文档,例如提前装运通知等

下图显示了字节大小与节点数之间的关系(在DOM模型下,该关系应与文档的内存占用量成正比)。不同的颜色对应于不同种类的文档。比例为对数/对数。黑线最适合蓝点。有趣的是,对于所有类型的文档,字节大小和节点大小之间的关系都是线性的,但是比例系数可能会非常不同。

解决方案

回答

如果我遇到了这个问题并且在Google上找不到任何东西,我可能会尝试自己动手做。

一些"信封背面"的东西可以让我们了解它的发展方向。但这有点需要我了解如何执行xml解析器。
对于非算法基准,请在此处查看:

  • http://www.xml.com/pub/a/Benchmark/exec.html
  • http://www.devx.com/xml/Article/16922
  • http://xerces.apache.org/xerces2-j/faq-performance.html

回答

我认为,除非我们做出大量假设,否则涉及太多的变量才能得出简单的复杂性指标。

一个简单的SAX样式解析器在文档大小方面应该是线性的,并且在存储方面应该是平坦的。

由于XPath表达式的复杂性起着巨大的作用,因此仅凭输入文档就无法描述类似XPath的东西。

同样,对于模式验证,大型但简单的模式很可能是线性的,而结构复杂得多的较小的模式将显示较差的运行时性能。

与大多数性能问题一样,获得准确答案的唯一方法是对其进行衡量,然后看看会发生什么!

回答

罗伯·沃克(Rob Walker)是对的:没有足够详细地说明问题。仅考虑解析器(并忽略它们是否执行验证的问题),主要有两种:基于树的DOM和基于流/基于事件的思想SAX(推)和StAX(拉)。概括地说,基于树的方法消耗更多的内存,并且速度较慢(因为我们需要完成对整个文档的解析),而基于流/事件的方法消耗的内存更少,并且速度更快。基于树的解析器通常被认为更易于使用,尽管StAX被认为是对SAX的巨大改进(易于使用)。

回答

我打算在应用程序中加载非常大的XML文件。我在这里提出了有关堆栈溢出的问题:大型文档的最快可能XML处理。

是的,这是解析部分,这是瓶颈。

我最终根本不使用XML解析器。相反,我尽可能高效地对字符进行了逐一解析,以优化速度。这样,在3 GHz Windows PC上,读取,解析和加载内部数据结构的速度为每秒40 MB。

我很想听听各种XML解析模式与此相比。