提高XML应用程序中的性能,第1部分

如今,XML 在很多性能关键型场景中扮演着重要角色。虽然很多开发人员都知道如何编写 XML 文档、XML 模式或 DTD,但有些人可能还没有认识到,XML 应用程序的性能取决于构造 XML 文档时所作出的一些决定,以及在解析 XML 文档之前,在解析器上设置了哪些特性。

很多开发人员也知道何时使用 SAX,何时使用 DOM API。通常,如果内存不充裕,而应用程序必须处理较大的文档,或者要在内存中创建自己的表示,那么您最好使用 SAX(而不是 DOM)。另一方面,如果应用程序需要随机访问和修改文档数据,想要实现复杂的搜索,或者计划多次遍历一个文档树,则可以尽量使用 DOM。在本文中,我们将解释哪些 SAX 或 DOM 操作和特性会影响应用程序的性能,并描述如何编写性能最佳的应用程序。

编写 XML 文档

负责编写 XML 文档的开发人员可以做各种事情来提高 XML 应用程序的性能。

每个 XML 文档都可以在 XML 声明中指定一种字符编码。为了达到最佳性能,在编写 XML 文档时应使用 US ASCII ( "US-ASCII" ) 作为编码。用 ASCII 字符编写的文档解析起来是最快的,因为每个字符都肯定是单字节的,可以直接映射到对应的 Unicode 值。如果文档是用 UTF-8 编码的,但是只包含 ASCII 字符,那么有些解析器(例如 Xerces2)处理这类文档时采用的方式与处理用 US-ASCII 编码的等价 XML 文档时采用的方式几乎相同。对于包含 ASCII 以外 的 Unicode 字符的文档,解析器必须为每个字符读取和转换多字节序列。这种转换会损失一定的性能。因为每个字符都规定使用两个字节,同时假设没有代替的字符,所以 UTF-16 编码在一定程度上减轻了这种性能损失。然而,如果使用 UTF-16 的话,原始文档的大小便要加倍,这样的文档解析起来要花更多的时间。

通过减少文档中的新行数目和空格,也可以提高性能。通常,为了编辑方便,开发人员会将文档组织成行 —— 例如,使用回车( #xD )和换行( #xA )。XML 解析器必须将双字符序列 #xD #xA 以及所有 #xD (后面没有跟 #xA )转换成单个的 #xA 字符。这种转换并非没有代价。对于解析过程的总体性能影响取决于文档中与新行数目相关的字符数。对于空格的使用也是如此。当您将空格添加到文档中时,解析器就要处理更多的字符,从而最终影响解析过程的性能。

另外,除非绝对有必要,否则应该避免在应用程序中使用名称空间(namespace)。处理启用了名称空间特性的文档会降慢对整个文档的处理。解析器不仅要处理名称空间的声明、验证它们的正确性,而且还要确保 XML 文档是名称空间格式良好的。

对于不需要进行验证的应用程序,它们的文档中应该 不包括 <!DOCTYPE...> 这一行。根据 XML 规范,验证处理程序(例如 Xerces2)必须处理内部和外部 DTD 子集,以获得关于默认属性、属性类型等信息。即使禁用了验证特性,该处理程序也仍然会处理 DTD。

当需要对应用程序进行验证时,应记住,处理和验证 DTD 所花费的代价通常比处理和验证 W3C XML Schema 的要小一些。此外,还应避免使用大量的外部实体 —— 例如外部 DTD 或导入的 XML 模式,因为打开和读取文件是代价很高的操作。同时要避免使用太多的默认属性,因为这会增加验证时间。XML Schema 的 redefine 结构和 identity 约束也应当避免,因为两者都会影响验证过程。

常见 SAX 性能提示

对于更消耗内存的 API(例如 DOM),选择 SAX 可以提高应用程序的性能。但是,您还可以做很多事情来进一步提高性能。试一试下面这些可以提高 SAX 应用程序性能的提示:

限制 XML 名称为内部化字符串。

在多个处理程序之间 切换内容处理程序来处理大型文档。

用实体分解器(resolver) 装载外部实体。

避免处理外部实体。

字符串内部化

SAX 指定了一个由特性 URI http://xml.org/sax/features/string-interning 标识的特性。在将该特性设为 true 时,它会通过调用 java.lang.String.intern() 来指示解析器以内部化字符串的形式报告 XML 名称(例如元素和属性的名称)以及名称空间 URI。

为了加快字符串等同性测试的速度,可以打开该特性。这里不需要调用一个字符一个字符地进行比较的 equals() 函数,相反,您可以通过引用将解析器报告的名称与字符串常量进行比较。如果使用解析器报告的 XML 名称作为 hash 表的键,那么,当该表调用 java.lang.String 的 hashCode 方法时,内部化字符串就可以缩短查找时间。虽然在 Javadoc 中没有指定,这个 hashCode 方法的实现通常会在计算 hash 码值之后,将其缓存在对象中。一旦计算出了 hash 码,想获得一个内部化字符串的 hash 码实际上就轻而易举了。

有些解析器的实现可能不支持字符串内部化特性。Xerces2 使用内部化字符串来获得更快的比较速度,所以这一特性永远是开着的。

时间: 2024-07-31 18:55:10

提高XML应用程序中的性能,第1部分的相关文章

采用AJAX提高网站程序的带宽性能

ajax|程序|性能 介绍 作为一个做网页性能测试的公司,我们一直关注新的开发技术在提高网页程序性能方面的影响.我们有不少用户遇到仅仅是因为他们网页的大小而影响其性能的问题.简单说--页面太大了不能在有限的带宽条件下达到理想的性能.很多情况下,在不同网页间包含的基本要素是相同的.例如,页头.页尾.导航条都很少变化,在一些程序中甚至根本没有变化.这点启发我们,如果程序只更新页面中需要改变的部分,将可以节省可观的带宽. 目标 为了验证这个理论,我们决定看看是否能让程序节约至少50%的带宽.我们选择了

采用AJAX提高网站程序的带宽性能详解

ajax|程序|详解|性能 介绍 作为一个做网页性能测试的公司,我们一直关注新的开发技术在提高网页程序性能方面的影响.我们有不少用户遇到仅仅是因为他们网页的大小而影响其性能的问题.简单说--页面太大了不能在有限的带宽条件下达到理想的性能.很多情况下,在不同网页间包含的基本要素是相同的.例如,页头.页尾.导航条都很少变化,在一些程序中甚至根本没有变化.这点启发我们,如果程序只更新页面中需要改变的部分,将可以节省可观的带宽. 目标 为了验证这个理论,我们决定看看是否能让程序节约至少50%的带宽.我们

存储.NET应用程序到定制的XML .config文件中

xml|程序   在决定分布基于.Net框架的应用程序之前,要决定怎样管理公共程序的设置.要提高代码的重用率和应用程序的互用性,所有的应用程序 – WEB, Windows, Web服务,Windows 服务都要使用应用配置文件作为公共的方法来管理以应用为中心的信息.      系统配置 vs. 应用配置   当.NET的公共语言运行库(CLR)执行应用程序的时候,它会使用一系列的XML配置文件来设置运行环境的基本属性.举例说,如果执行WEB应用程序,那么CLR就会询问WEB.config文件来

Java开发中程序和代码性能优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升,在开发中注意这些,更多的是可以保持一种性能优先的意识. 一 条件控制语句中的优化 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();i++) 可以改为 //我的电脑上,测试数量级在10^7,速度提升一倍. for(int i=0,len=li

在PHP中开发XML应用程序之基础篇

xml|程序 一. XML简介 XML(可扩展的标注语言)是一种W3C标准,主要用于Web应用程序和服务器之间实现容易的交互.数据的存储与使用. 使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构.XML数据是平台和应用程序独立的.不用多说,这本身就使XML成为适合于互联网的一个理想的数据交换格式(事实上,它正是因这一用途而被开发的).最近,宽带连接的增长及消费者对于越过任何媒体进行数据共享的应用软件的需求意味着,XML Web服务和应用软件正变得越来越丰富. XML的发明正是为了解

ASP.NET2.0中创建基于XML应用程序

XML是目前在Web上应用很普遍的一项技术,而在.NET 2.0中,则提供了更为丰富的功能,使得在创建XML应用的时候更加得心应手.在本文中,将简单以一个例子来说明,.NET 2.0在创建XML应用时的一些新特性. 首先,我们平常在创建Web应用时,都会选择以数据库的形式来存贮数据的,但如果要以纯XML来存贮数据的话,那的确会是种挑战.在.NET 1.0/1.1框架中,对XML的支持功能有限,比如对同一应用中的多个XML文件的支持.在.NET 2.0中,这种情况得到了改变,增加了新的功能,比如:

datagridview vb-VB程序中使用datagridview的性能问题

问题描述 VB程序中使用datagridview的性能问题 最近在做的一个VB写的程序,其中一个页面用到datagridview,涉及到三千多列,存取的时候特别慢,有什么优化的意见?或者用其他更好的方式来实现会好点? 解决方案 减少列数,没什么特别是好的办法,一个表有3000列是不符合标准的

PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节_php技巧

一. XML简介 XML(可扩展的标注语言)是一种W3C标准,主要用于Web应用程序和服务器之间实现容易的交互.数据的存储与使用. 使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构.XML数据是平台和应用程序独立的.不用多说,这本身就使XML成为适合于互联网的一个理想的数据交换格式(事实上,它正是因这一用途而被开发的).最近,宽带连接的增长及消费者对于越过任何媒体进行数据共享的应用软件的需求意味着,XML Web服务和应用软件正变得越来越丰富. XML的发明正是为了解决描述网上丰富

如何集成Perf4j到Java应用程序中并生成性能数据

在实际部署的生产环境能够以较低的风险及成本实现对业务逻辑级别性能问题的追踪.本文将介绍如何集成 Perf4j 到 Java 应用程序中并生成性能数据. 系统日志是应用程序问题诊断及运行维护的重要工具.Logback.Log4j 是常用于 Java 平台的日志记录 API. 目前大部分产品只是将系统重要参数.状态的变化及异常信息通过日志输出.本文将要介绍的 Perf4j 是一款专门用于 Java 服务器端代码计时.记录日志和监控结果的开源工具包.Perf4j 对常用日志工具包进行了扩展,能够将得到