使用Xerces-J的SAX方式进行XML程序设计
--性能优化
尽管Xerces-J的速度和内存消耗已经令人满意,但是在实际使用的时候还是有很多可以优化的地方。另外在一些速度和内存消耗要求比较高的场合,对Xerces-J进行优化经常可以收到意想不到的效果。
首先,需要进行优化的内容就是是否打开校验。尽管Xerces-J的校验功能可以尽早发现很多错误从而避免很多灾难性的事故发生,但是校验是非常消耗内存和时间的行为。如果XML文档的来源是可靠的,例如程序生成的或者是已经经过校验的,关闭校验功能可以大大提高性能,根据笔者自己进行的测试,速度可以提高三倍左右。
其次,由于创建一个解析器(parser)是要消耗时间和空间的,因此如果能够使用已经存在的解析器(parser),就使用已经存在的解析器,尽可能的少创建解析器。
第三,对于XML文档来说,如果能够使用US-ASCII编码,就使用US-ASCII编码,对于某些不接触多字节的配置文件,使用US-ASCII编码并且在XML文件中声明encoding="US-ASCII"可以加快解析速度。另外,UTF-8或者UTF-16也是不错的选择。尽量少的使用外部的DTD或者schema文件,显而易见,打开一个外部文件要消耗很多的时间,如果是在广域网上打开一个外部文件消耗的时间就更多了。不要使用很多的缺省属性,显而易见,使用缺省属性需要解析器作额外的检查工作,结果影响解析速度。尽量减少文件的长度。
第四,在使用大XML文件的时候最好不要使用DOM解析器使用我们这里介绍的SAX解析器。DOM在解析大的XML文件的时候会消耗太多的内存。
第五,在JSP等场合使用时,使用JIT是一个不二的选择。由于JSP编译成的class代码驻留内存,因此不存在每次访问都会进行本机代码编译造成的启动速度损失。
此外,我们还可以使用GCJ或者GCC2.95以上版本的编译器把Xerces-J编译成本机代码从而提高速度。关于GCC和GCJ的信息,请访问 http://gcc.gnu.org。这个东西我还没有试用过,据说不错,用过的请告诉我一声。
最后,如果不需要使用XML的地方,不要使用XML。尽管XML是一种不错的东西,在很多方面有其优势,XML并不是在所有的方面做的最好的,如果用一行文本就可以解决的问题使用一个XML文件,肯定会得不偿失的。