XML也许是我们储存数据和通讯数据中最常见的一种简易方式,当我们来到XML的海洋时,我们会发现当我们用iPhone程序解析XML时,我们是有如此多的选项,让人眼花缭乱。iOS SDK本身就带有两种不同的解析库可以使用,除此之外还有很多很受欢迎的第三方的库,比如说 TBXML, TouchXML, KissXML, TinyXML, 和 GDataXML,我们究竟如何选择呢?真是个问题。

XMLPerformance Test App Extended For 3rd Party Libraries

我通过拓展苹果官方的 XMLPerformance 示例代码,来考察了各种XML解析器的运行性能,我觉得把这些经验写出来可能会帮助那些对XML解析性能认识的不是很清楚的开发者了解XML解析的性能状况。

事实上,如果你经常使用XML文件来更新你的App中的数据的话,解析的性能就会显得十分重要,20s的解析时间和10s的解析时间绝对是不一样的,相信我。

下面,我们就看看这些解析方式是如何使解析性能发生改变的吧。在最后,还有一个整体的性能测试App下载。

SAX 还是 DOM

在我们开始之前,我想要说明一个XML解析器中的大分类,任何一个解析器,首先你都必须先弄清楚他是一个SAX解析器,还是一个DOM解析器。

  • 简单来说,SAX解析器会检测整个XML树形结构,你的代码会控制它在哪里停止,使用哪些数据之类的事情。就是说,SAX可控制性强,占用内存小,适用于提取部分数据。
  • 而DOM解析器会检测整个文档并且在内存中生成一个复制品,之后你的任何操作都是在这个复制品中进行的。

好了,现在我们开始讨论解析库。

iPhone平台上最受欢迎的XML解析器

通过调查,我发现下面这些XML解析库是在iOS平台上比较受欢迎的:

  • NSXMLParser这是iPhone SDK中自带的Sax解析器,在DOM解析方面较弱,由Objective-C语言编写。
  • libxml2这也是iPhone SDK中自带的,是一个开源的库,这是基于C的,所以比NSXML用得更广一些。主要的特性就是可以一边读取一边解析。也就是说,xml文件一边还在下载着,你的程序中已经可以显示里面的内容了。
  • TBXML这是一个轻量级的DOM解析器,为了加快DOM方式的解析速度而诞生,不支持XPath,也不能修改XML文件中的内容。
  • TouchXML这是一个NSXML类似的DOM解析器,就像TBXML一样,这是只读的,但是却支持XPath查询。
  • KissXML这是TouchXML的改进版本,支持读写。
  • TinyXML基于C的DOM解析器,体积很小但是支持读写,不支持XPath,但是你可以使用TinyXpath来帮助这个库。
  • GDataXML这是谷歌官方开发的Objective-C客户端库的一部分,也是一个NSXML类似的DOM解析器,支持读写和XPath查询。

好了,下面我们就开始比较这些库的性能

检测一下各种解析方式的性能吧

XML Parser Stats Display in Test App

苹果官方提供了一个非常好的示例程序,解析一个大概900KB大,包括itunes排名前300的歌曲的XML文档。

最好的方法是你下载下来自己看看,这个App就是图中所示的界面

下载性能测试程序源码

下面我们来看看测试的结果

XML解析器性能大比拼

这是我实机测试的数据:

Parsing Time By Parser

很明显,NSXMLParser是最慢的,TBXML是最快的,这是由于TBXML的功能是最少的。

其实看到DOM解析器运行比SAX快对于来说也是很奇怪的,后来我搞懂了不停地比较字符串需要不停地停止后继续,导致速度变慢。

我还制作了他们使用内存峰值的图表

Memory Usage By Parser

可以看出DOM的解析方式通常比SAX的解析方式需要使用更多的内存。

最后,我们来总结一下这些解析器的的综合状况和区别:

NSXML libxml2 – SAX TBXML TouchXML KissXML TinyXML GDataXML libxml2 – DOM
Included with SDK? Yes Yes No No No No No Yes
Seconds to Parse 1.87 1.19 0.68 1.1 1.37 1.27 1.07 0.84
Peak Memory Usage 3.11 3.01 3.07 6.5 5.25 4.8 4.15 4.97
Parse While Downloading? No Yes No No No No No No
Edit/Save XML? No No No No Yes Yes Yes Yes
XPath Support? No No No Yes Yes Yes* Yes Yes
C or Obj-C Obj-C C Obj-C Obj-C Obj-C C Obj-C C
License Apple MIT MIT MIT MIT ZLib Apache MIT

那究竟选哪个呢?

究竟选哪一个解析器取决于你想要让这个解析器干些什么事情:

  • 如果你读取的是很小的文件的话,小文件的读取并不会影响任何性能,所以你应该使用即是Objective-C写的,又能够支持XPath的,我在这里特别推荐TouchXML, KissXML, 和GDataXML
  • 如果你希望使用读写功能,而性能对你来说又不是非常重要的话,我推荐你使用KissXML或者GDataXML 这种功能强大的库。
  • 而如果你要读取的XML文件非常大,而性能也很重要的话,你也许就应该考虑libxml2 SAX, TBXML, o或者libxml DOM 了

我没有提到的场景下该用什么?

  • 如果你不喜欢第三方库,又在处理比较小的XML文件,NSXML就是你的选择
  • TinyXML可以用来处理中等大小的XML文档,如果你喜欢C的话,估计你也会喜欢他。

我也曾经尝试过其他的第三方库,但是都不管用


原文地址: http://www.dasheyin.com/ru_he_gei_ni_ios_xiang_mu_xuan_ze_zui_he_shi_de_xml_jie_xi_fang_shi.html