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

时间:2008-08-28 08:01:13

标签: xml algorithm performance

我需要知道不同XML工具(解析器,验证器,XPath表达式求值程序等)的性能如何受输入文档的大小和复杂性的影响。那里有资源记录了CPU时间和内存使用情况如何受到影响......好吧,什么?文件大小以字节为单位节点数?关系是线性的,多项式的还是更差的?

更新

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

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

文章为here.

更新

我无法找到任何正式的治疗方法。为了它的价值,我做了一些实验,测量XML文档中节点的数量,作为文档大小的函数。我正在研究仓库管理系统,XML文档是典型的仓库文档,例如高级发货通知等。

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

benchmarks-bytes_vs_nodes

4 个答案:

答案 0 :(得分:3)

如果我遇到了这个问题但在谷歌上找不到任何东西,我可能会尝试自己做。

一些“回归信封”的东西,以了解它的发展方向。但是有必要让我知道如何做一个xml解析器。 对于非算法基准测试,请看这里:

答案 1 :(得分:1)

我认为除非你做了很多假设,否则有太多的变量需要提出一个简单的复杂度指标。

简单的SAX样式解析器在文档大小方面应该是线性的,对于内存应该是平的。

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

同样,对于模式验证,大而简单的模式可能是线性的,而具有更复杂结构的较小模式会显示更差的运行时性能。

与大多数表现问题一样,获得准确答案的唯一方法是衡量它并看看会发生什么!

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我打算在我的应用程序中加载非常大的XML文件。我在Stack Overflow上问了这个问题:Fastest Possible XML handling for very large documents

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

我最终根本没有使用XML解析器。相反,我尽可能有效地解析字符以优化速度。这导致3 GHz Windows PC上的速度达到每秒40 MB,用于读取,解析和加载内部数据结构。

我很想知道各种XML解析模式与此相比如何。