XMLBench项目:快速多平台XML库的比较
立即解锁
发布时间: 2025-08-23 00:24:06 阅读量: 2 订阅数: 7 

# XMLBench项目:快速多平台XML库的比较
## 1. 引言
XML技术在信息管理系统领域带来了许多新的理念和能力。如今,XML几乎无处不在,从小型配置文件到数GB的测量存档,许多网络服务也将XML用作传输协议。基于XML的应用程序利用多种XML技术来简化软件开发,例如使用DOM创建和导航XML文档,使用XSD模式检查一致性和有效性,使用XSL简化不同格式之间的转换,使用XML加密和签名建立安全可靠的信息交换和存储方式。
这些技术由多个商业和开源库提供,这些库在功能和性能上有很大差异。而且,有些库针对特定任务进行了优化,因此实际的库性能可能会根据处理的数据类型而显著不同。为了全面比较可用XML工具包的功能和维持所需性能的能力,启动了XMLBench项目,主要目标是针对能够在多个平台上运行的快速C和C++库。应用的测试比较了XML处理的不同方面,并在几个自动生成的数据集上运行,以模拟不同任务对库的使用。
## 2. XML工具包
### 2.1 Expat
Expat是一个非常简单快速的XML解析器,广泛用于各种开源软件,如Mozilla项目。虽然它只实现了SAX API,但Sablotron和Arabica库在Expat之上实现了DOM、XPath和XSLT规范。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | Expat 2.0.1 (2007年6月5日),Arabica Oct2008,Sablotron 1.0.3 |
| 许可证 | 开源MIT许可证 |
| 支持系统 | 32/64位版本;Windows、Linux、BSD、OS X、Solaris、QNX、HP-UX、AIX |
| 原生语言 | C |
| 语言绑定 | Lua、OCaml、Perl、PhP、Python、Ruby、Tcl/Tk |
| XML版本 | XML 1.0、命名空间、XInclude |
| 支持的API | SAX 1和2、DOM级别2 |
| 网络 | - |
| 验证 | 仅DTD |
| 安全 | - |
| 查询 | XPath 1.0 |
| 样式表 | XSLT 1.0 |
| 网络服务 | - |
### 2.2 Apache XML项目
Apache XML项目由Apache软件基金会维护,该项目由几个库组成,每个库都有C++和Java版本:
- Apache Xerces是一个验证型XML解析器。
- Apache Xalan提供XPath和XSL转换的实现。
- Apache Axis提供Web服务基础设施。
- Apache XML Security实现XML签名和加密规范。
- Apache FOP实现XSL - FO。
- XPath2和XQuery由第三方项目XQilla提供。
由于Xerces - C 3.0仅由尚未发布的Xalan - C 1.11支持,且Apache XML Security依赖于Xalan - C,所以大多数测试使用Xerces - C 3.0和Xalan - C 1.11的预发布版本,加密和签名基准测试使用Xerces - C 2.8.0、Xalan - C 1.10和Apache XML Security 1.4.0。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | Xerces 3.0 (2008年9月29日),Xalan 1.10,XML Security 1.4.0 |
| 许可证 | 开源Apache许可证2.0 |
| 支持系统 | 32/64位版本;Windows、Linux、BSD、OS X、Solaris、AIX、HP-UX |
| 原生语言 | C++和Java |
| 语言绑定 | Perl |
| XML版本 | XML 1.0和1.1(部分)、命名空间、XInclude |
| 支持的API | SAX 1和2、DOM级别2和3 |
| 网络 | FTP、HTTP |
| 验证 | DTD、模式1.0 |
| 安全 | 规范XML 1.0、XML签名和加密 |
| 查询 | XPath 1.0和2.0 |
| 样式表 | XSLT 1.0、XSL - FO 1.1(仅Java) |
| 网络服务 | SOAP 1.1和1.2、附件、二进制序列化、WSDL 1.1、JSON |
### 2.3 Gnome XML库
Gnome XML是为Gnome项目开发的一组库,后来广泛应用于Gnome之外。该工具包的核心是Gnome XML和XSLT库,分别称为LibXML和LibXSLT。XML安全由XMLSec库提供,DOM API由GDome库提供,SOAP使用CSOAP,XSL - FO由xmlroff提供。
由于未解决的问题,LibXML 2.7.3在创建/序列化大型DOM文档时比2.6.x分支慢很多,因此在DOM创建基准测试中使用LibXML 2.6.32的结果,其他结果使用LibXML 2.7.3。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | LibXML 2.7.3 (2009年1月18日),LibXSLT 1.1.24,XmlSec 1.2.11,GDome 0.8.1 |
| 许可证 | 开源MIT许可证 |
| 支持系统 | 32/64位版本;Windows、Linux、BSD、OS X、Solaris、QNX |
| 原生语言 | C |
| 语言绑定 | Perl、PhP、Python、Ruby、Tcl/Tk |
| XML版本 | XML 1.0第5版、命名空间、XInclude |
| 支持的API | SAX 1和2、原生DOM风格、DOM级别2 |
| 网络 | FTP、HTTP |
| 验证 | DTD、模式1.0(部分)、Relax - NG |
| 安全 | 规范XML 1.0、XML签名和加密 |
| 查询 | XPath 1.0 |
| 样式表 | XSLT 1.0、EXSLT、XSL - FO 1.1(部分) |
| 网络服务 | SOAP 1.1 |
### 2.4 QTSoftware XML模块
QT是一个流行的跨平台应用程序框架,从版本3开始包含一个提供一些XML处理功能的模块。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | Qt 4.4.3 (2008年9月27日) |
| 许可证 | 商业、开源GPL和LGPL许可证 |
| 支持系统 | 32/64位版本;Windows、Linux、BSD、OS X、Solaris、QNX、HP-UX、AIX |
| 原生语言 | C++ |
| 语言绑定 | Python |
| XML版本 | XML 1.0、命名空间 |
| 支持的API | SAX 2、DOM级别2 |
| 网络 | FTP、HTTP |
| 验证 | 仅DTD |
| 安全 | - |
| 查询 | XQuery 1.0、XPath 2.0 |
| 样式表 | - |
| 网络服务 | - |
### 2.5 Intel XML软件套件
Intel利用其最新处理器的所有功能开发了XML软件套件(XSS)。XSS经过大量优化,利用了完整的SEE指令集,包括SSE4。它是唯一在处理单个文档时可以从多核中受益的测试工具包,但在当前的基准测试中,使用双核机器未显示出性能优势,因此本文未包含多核结果。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | Intel XSS 1.2 (2009年1月19日) |
| 许可证 | 商业,源代码不可用 |
| 支持系统 | 32/64位版本;Windows、Linux、HP-UX |
| 原生语言 | C++/Java |
| 语言绑定 | - |
| XML版本 | XML 1.0第5版、命名空间、XInclude |
| 支持的API | SAX 2、DOM级别2和部分级别3、StAX解析器(仅Java) |
| 网络 | FTP、HTTP |
| 验证 | DTD、XML模式1.0 |
| 安全 | - |
| 查询 | XPath 1.0 |
| 样式表 | XSLT 1.0 |
| 网络服务 | - |
### 2.6 Oracle XDK
Oracle XML开发工具包(XDK)由Oracle公司开发,用于在其数据库解决方案中提供XML功能。
| 信息项 | 详情 |
| ---- | ---- |
| 版本 | Oracle XDK 10g 10.2.0.2.0 (2006年4月7日) |
| 许可证 | OTN,源代码不可用 |
| 支持系统 | 仅32位;Windows、Linux、HP-UX、AIX |
| 原生语言 | C/C++/Java |
| 语言绑定 | - |
| XML版本 | XML 1.0、命名空间、XInclude |
| 支持的API | DOM级别2和3、StAX(仅Java)、SAX 1 |
| 网络 | FTP、HTTP |
| 验证 | DTD、XML模式1.0 |
| 安全 | - |
| 查询 | XPath 1.0、Java版本中的XPath 2.0 |
| 样式表 | XSLT 1.0、Java版本中的XSLT 2.0 |
| 网络服务 | - |
## 3. 基准测试结果
### 3.1 系统设置
- **硬件平台**:Fujitsu - Siemens Celsius W350工作站
- Intel Core Duo E6300(1.86GHz,2MB L2缓存)
- Fujitsu - Siemens D3217 - A,Intel Q965芯片组(ICH8R,1066 MHz总线)
- 4GB DDR2 - 800内存
- **操作系统**:64位版本的Gentoo Linux
- 内核2.6.25
- GNU C库2.6.1
- GNU C编译器4.2.4
- Java SE运行时环境1.6.0 07(64位)
- **编译选项**:使用 - O2 - march = nocona优化标志来构建所有开源库
XML数据在运行基准测试前总是预先生成并加载到内存中,因此硬盘性能不影响结果。但在一些大型数据集的DOM基准测试中,部分解析器使用的内存超过4GB,会发生磁盘交换,这些结果高于拒绝阈值,被评为最差值。
### 3.2 数据描述
基准测试过程中使用了四种不同的数据集,均不包含DTD定义:
- **RDF**:来自DMoz.org项目的大型RDF(资源描述框架)文档,描述各种Web资源。它包含来自几个命名空间的节点,深度恒定为3层。
- **XMLGen**:可扩展数据生成器,生成非常简单的XML内容,深度为4层,无命名空间,不同XML节点数量非常有限。
- **XMark**:由XMark项目提供的另一个可扩展数据生成器,生成模拟拍卖网站的XML文档。XML结构稍复杂,深度可达8层,XML元素种类更多,仍未使用命名空间。
- **OPCGen**:模拟OPC XML - DA服务器行为的数据生成器,生成数据交换中使用的SOAP消息。部分消息的大小通过缩放参数进行缩放,其他消息保持不变。节点和属性属于3个不同的命名空间,生成的XML深度根据消息类型从1到5不等。
### 3.3 基准测试设置
对于每个工具包,测量处理数据所需的时间,然后将该时间除以参考实现完成相同任务在相同数据上所需的时间,得到的结果称为性能指数,在下面的性能图表中显示(指数值越小表示结果越好)。为防止单个失败测试影响整体结果,单次运行的性能指数最大值限制为10(DOM解析基准测试为15)。Gnome XML工具包(LibXML、LibXSLT和XMLSec)的库用作参考实现。
所有测试都在单用户模式下运行,没有任何系统服务运行。为消除任何负面干扰的可能性,针对每个任务、每种数据类型和每个XML工具包执行一个独立的测试应用程序。这些应用程序评估给定数据集的多个文档实例的性能,并使用平均值。数据生成器的缩放参数保持不变,文本节点和属性的值随机生成。文档数量的选择使得单个测试大约需要5到10分钟完成,并且至少处理10个文档以确保结果的稳定性。如果可能,在数据处理之前进行工具包初始化,初始化所花费的时间不计入基准测试分数,生成XML和将其加载到内存所需的时间也被排除。
### 3.4 解析基准测试
解析基准测试评估解析XML文档并将包含的信息提供给应用程序所需的时间。在对XML数据进行任何其他操作之前都需要进行解析,因此解析性能对涉及XML数据使用的任何应用程序的整体性能有显著影响。
目前广泛使用两种主要的解析方法:
- **DOM解析器**:构建一个对象的链接树,提供获取和设置关联属性值以及导航到相邻元素的方法。
- **SAX解析器**:应用程序定义一组回调,当在XML流中遇到相应数据时调用这些回调。
一般来说,DOM表示更容易处理,可用于更改XML文档的内容;SAX解析器通常更快,对XML文档的大小没有限制。为了显示SAX和DOM解析器的相对性能,使用LibXML的SAX模式解析器的计时来计算SAX和DOM两种情况下的性能指数。由于大多数DOM解析器比其SAX对应物慢,因此DOM解析器的最大允许指数提高到15。
### 3.5 DOM操作基准测试
此基准测试评估XML工具包在DOM表示中操作数据的能力。首先使用DOM API创建XMLGen样式的文档,然后将其序列化为UTF - 8字符串。在测试中,生成的字符串大小从5 KB到90 MB不等。
### 3.6 模式验证基准测试
该基准测试比较工具包根据XML模式验证文档所需的时间。数据由XMLGen和OPCGen生成器生成,XMLGen模式非常简单,不包含任何类型检查,仅由20行组成;OPC数据结构复杂,由考虑多个XSI类型检查的相当复杂的模式定义描述。为了获得纯验证时间,从解析和验证所花费的总时间中减去未验证的解析时间。验证上下文仅在初始化阶段创建一次。
### 3.7 XML安全基准测试
安全功能通过两个独立的测试进行测量:
1. 评估使用数字签名对XML文档进行签名,然后验证该签名所需的时间。
2. 评估加密XML文档,然后将其解密所需的时间。
密钥生成和安全上下文的初始化在测试初始化期间执行,不影响结果,解析原始文档所需的时间也不包括在内。
### 3.8 XSL转换基准测试
此基准测试评估XSL转换引擎的性能。将XMLGen和RDF样本转换为HTML,将相当大的ODF(开放文档格式)文档转换为MediaWiki格式。XMLGen和RDF都使用小型简单的XSL样式表进行处理,但处理RDF文档的样式表需要在大节点集上进行引用查找。用于处理ODF文档的样式表来自OpenOffice 3发行版,结构更复杂。
转换引擎仅在初始化阶段创建一次,解析原始文档所需的时间从呈现的结果中排除。
### 3.9 软件优化
可以采取一些措施来优化与开源库链接的XML应用程序的速度:
- **编译器和优化标志**:性能在很大程度上取决于用于构建XML库栈的编译器和优化标志。在大多数Linux发行版中,软件使用安全但不一定是最优的标志进行编译。使用更好的优化标志重新编译某些库可以显著提高性能。升级到64位操作系统并安装最新版本的Gcc编译器和Glibc系统库也可以提高性能。不同编译器和优化选项对性能的影响因库和硬件而异,需要针对每个具体情况进行评估。
- **字符编码**:如果XML数据包含非拉丁字母书写的文本消息,选择合适的字符编码非常重要。例如,LibXML内部以UTF - 8编码处理数据,如果数据使用UTF - 16编码,性能会显著下降;反之,Xerces/C具有UTF - 16内部数据表示,如果传递UTF - 8编码的文档,性能也会下降。
- **研究项目参考**:如果性能是最终目标,有两个研究项目可能会有用。AsmXml是一个非常高效的开源XML解析器,提供DOM风格的API,但功能集非常有限(甚至不支持命名空间),需要描述要处理的XML文档语法的模式文件。
## 4. 总结与讨论
### 4.1 基准测试结果总结
通过对多种XML工具包在不同基准测试中的表现进行分析,可以总结出各工具包在不同方面的性能特点。以下是对各基准测试结果的简要总结:
| 基准测试类型 | 关键要点 |
| ---- | ---- |
| 解析基准测试 | DOM解析器构建对象树便于操作但速度慢,SAX解析器速度快且对文档大小无限制,使用LibXML的SAX模式解析器计时计算性能指数,DOM解析器最大允许指数提高到15 |
| DOM操作基准测试 | 评估工具包在DOM表示中操作数据的能力,生成的字符串大小从5 KB到90 MB不等 |
| 模式验证基准测试 | 比较工具包根据XML模式验证文档的时间,通过减去未验证解析时间获得纯验证时间,验证上下文仅初始化一次 |
| XML安全基准测试 | 通过签名验证和加密解密两个独立测试测量安全功能,初始化操作不影响结果,不包含解析原始文档时间 |
| XSL转换基准测试 | 评估XSL转换引擎性能,不同样本使用不同样式表处理,转换引擎仅初始化一次,排除解析原始文档时间 |
### 4.2 工具包性能分析
不同的XML工具包在各项基准测试中表现出不同的优势和劣势。例如,Expat是一个简单快速的解析器,但功能相对单一,仅实现了SAX API;Apache XML项目功能较为全面,但在版本兼容性上存在一些问题;Gnome XML库在某些情况下性能会受到版本影响;QTSoftware XML模块提供了基本的XML处理功能;Intel XML软件套件经过优化,但在当前基准测试中多核优势未体现;Oracle XDK主要用于数据库解决方案。
### 4.3 性能优化建议
根据基准测试结果和分析,为了提高XML应用程序的性能,可以采取以下优化建议:
1. **编译器和优化标志**:使用更好的优化标志重新编译开源库,如 - O3 –unroll-loops -mfpmath=sse,387 -march=nocona等,同时升级到64位操作系统和最新版本的Gcc编译器和Glibc系统库。
2. **字符编码**:根据工具包的内部数据表示选择合适的字符编码,避免因编码不匹配导致性能下降。
3. **研究项目参考**:对于追求极致性能的情况,可以考虑使用AsmXml等高效的开源解析器,但需要注意其功能的局限性。
### 4.4 可靠性讨论
基准测试结果的可靠性受到多种因素的影响,如硬件平台、操作系统、编译器版本、数据类型等。在本次基准测试中,虽然采取了一系列措施来确保结果的可靠性,如使用单用户模式、独立测试应用程序、排除初始化和数据加载时间等,但仍然可能存在一些潜在的影响因素。例如,不同工具包对内存的使用方式可能不同,在处理大型数据集时可能会导致性能差异;某些工具包可能对特定的数据结构或模式有更好的优化,从而在相应的基准测试中表现更优。因此,在参考基准测试结果时,需要综合考虑各种因素,并根据实际应用场景进行选择。
### 4.5 未来展望
随着XML技术的不断发展和应用场景的不断拓展,对XML工具包的性能和功能要求也会越来越高。未来的研究可以从以下几个方面展开:
1. **多核性能优化**:进一步研究如何充分发挥多核处理器的优势,提高XML处理的并行性和效率。
2. **新功能支持**:随着XML规范的不断更新,工具包需要支持更多的新功能,如XML Schema 1.1、XQuery 3.0等。
3. **性能评估方法改进**:开发更准确、全面的性能评估方法,考虑更多的实际应用场景和影响因素。
### 4.6 流程图:XML应用程序性能优化流程
```mermaid
graph LR
A[选择XML工具包] --> B[进行基准测试]
B --> C{性能是否满足需求}
C -- 是 --> D[使用工具包开发应用程序]
C -- 否 --> E[分析性能瓶颈]
E --> F[选择优化方法]
F --> G[实施优化措施]
G --> B
```
### 4.7 总结与建议
综上所述,在选择XML工具包时,需要综合考虑其功能、性能、兼容性和可靠性等因素。通过基准测试可以了解各工具包在不同方面的表现,但需要注意测试结果的局限性。在开发XML应用程序时,应根据实际需求选择合适的工具包,并采取相应的优化措施来提高性能。同时,关注XML技术的发展趋势,及时更新工具包和优化方法,以适应不断变化的应用场景。
希望以上内容对大家在选择和使用XML工具包时有所帮助。如果您有任何疑问或建议,欢迎在评论区留言讨论。
0
0
复制全文
相关推荐










