XML也许是我们储存数据和通讯数据中最常见的一种简易方式,当我们来到XML的海洋时,我们会发现当我们用iPhone程序解析XML时,我们是有如此多的选项,让人眼花缭乱。iOS SDK本身就带有两种不同的解析库可以使用,除此之外还有很多很受欢迎的第三方的库,比如说 TBXML, TouchXML, KissXML, TinyXML, 和 GDataXML,我们究竟如何选择呢?真是个问题。
我通过拓展苹果官方的 XMLPerformance 示例代码,来考察了各种XML解析器的运行性能,我觉得把这些经验写出来可能会帮助那些对XML解析性能认识的不是很清楚的开发者了解XML解析的性能状况。
事实上,如果你经常使用XML文件来更新你的App中的数据的话,解析的性能就会显得十分重要,20s的解析时间和10s的解析时间绝对是不一样的,相信我。
下面,我们就看看这些解析方式是如何使解析性能发生改变的吧。在最后,还有一个整体的性能测试App下载。
在我们开始之前,我想要说明一个XML解析器中的大分类,任何一个解析器,首先你都必须先弄清楚他是一个SAX解析器,还是一个DOM解析器。
好了,现在我们开始讨论解析库。
通过调查,我发现下面这些XML解析库是在iOS平台上比较受欢迎的:
好了,下面我们就开始比较这些库的性能
苹果官方提供了一个非常好的示例程序,解析一个大概900KB大,包括itunes排名前300的歌曲的XML文档。
最好的方法是你下载下来自己看看,这个App就是图中所示的界面
下载性能测试程序源码
下面我们来看看测试的结果
这是我实机测试的数据:
很明显,NSXMLParser是最慢的,TBXML是最快的,这是由于TBXML的功能是最少的。
其实看到DOM解析器运行比SAX快对于来说也是很奇怪的,后来我搞懂了不停地比较字符串需要不停地停止后继续,导致速度变慢。
我还制作了他们使用内存峰值的图表
可以看出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 |
究竟选哪一个解析器取决于你想要让这个解析器干些什么事情:
我没有提到的场景下该用什么?
我也曾经尝试过其他的第三方库,但是都不管用
欢迎关注我的围脖: @Oratis
在知乎和豆瓣上,我的名字也是Oratis
我会把之后发表的教程分享到这些社交网络中。
如果你有任何问题,欢迎在底下留言,也欢迎写信给我,我的邮箱地址是: [email protected]
下面,我们会将接一些具体的内容,也就是如何真正的解析XML文档,《iOS教程:如何使用GDataXML读写XML文档》