iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果和工程代码附件。

 
我们选择的测试对象包含下面的这几个框架,其中NSJSONSerialization是iOS5系统新增的JSON解析的API,需要iOS5的环境,如果您在更低的版本进行测试,应该屏蔽相应的代码调用。
 
- [SBJSON (json-framework)]( http://code.google.com/p/json-framework/)
- [TouchJSON (from touchcode)]( http://code.google.com/p/touchcode/)
- [YAJL (objective-C bindings)]( http://github.com/gabriel/yajl-objc)
 
我们选择了四个包含json格式的数据的文件进行测试。每一个文件进行100的解析动作,对解析的时间进行比较。
 
工程包含以下的文件和框架:
 

测试时间间隔的的代码的宏定义如下,其中计算的次数和解析的代码由外部调用传入:

#define RunWithCount(count, description, expr) \
do { \
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); \
for(NSInteger i = 0; i < count; i++) { \
         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; \
         expr; \
         [pool release]; \
} \
\
CFTimeInterval took = CFAbsoluteTimeGetCurrent() - start; \
NSLog(@"%@ %0.3f", description, took); \
\
} while (0)

 
这是外面调用的代码,设置读取的json文件和计算的次数,每一个函数在进行对应框架API的解析代码:

         JSONTest *test = [[ JSONTest alloc] init];
         NSInteger count = 100;
        [test runWithResourceName:@"twitter_public.json" count:count];
         [test runWithResourceName:@"lastfm.json" count:count];
         [test runWithResourceName:@"delicious_popular.json" count:count];
         [test runWithResourceName:@"yelp.json" count:count];

 
我们的测试的环境是Xcode 4.2和iOS5,计算次数是100次,这是计算的结果Log:

2011-11-24 14:48:59.441 JSONPerfTest[9716:207] SBJSON-twitter_public.json 0.335
2011-11-24 14:48:59.625 JSONPerfTest[9716:207] YAJL-twitter_public.json 0.183
2011-11-24 14:49:00.095 JSONPerfTest[9716:207] TouchJSON-twitter_public.json 0.469
2011-11-24 14:49:00.226 JSONPerfTest[9716:207] JSONKit-twitter_public.json 0.130
2011-11-24 14:49:00.390 JSONPerfTest[9716:207] NextiveJson-twitter_public.json 0.164
2011-11-24 14:49:00.504 JSONPerfTest[9716:207] NSJSONSerialization-twitter_public.json 0.113
2011-11-24 14:49:01.196 JSONPerfTest[9716:207] SBJSON-lastfm.json 0.691
2011-11-24 14:49:01.516 JSONPerfTest[9716:207] YAJL-lastfm.json 0.320
2011-11-24 14:49:02.367 JSONPerfTest[9716:207] TouchJSON-lastfm.json 0.850
2011-11-24 14:49:02.580 JSONPerfTest[9716:207] JSONKit-lastfm.json 0.212
2011-11-24 14:49:02.861 JSONPerfTest[9716:207] NextiveJson-lastfm.json 0.280
2011-11-24 14:49:03.039 JSONPerfTest[9716:207] NSJSONSerialization-lastfm.json 0.177
2011-11-24 14:49:03.546 JSONPerfTest[9716:207] SBJSON-delicious_popular.json 0.506
2011-11-24 14:49:03.787 JSONPerfTest[9716:207] YAJL-delicious_popular.json 0.240
2011-11-24 14:49:04.460 JSONPerfTest[9716:207] TouchJSON-delicious_popular.json 0.672
2011-11-24 14:49:04.668 JSONPerfTest[9716:207] JSONKit-delicious_popular.json 0.207
2011-11-24 14:49:04.904 JSONPerfTest[9716:207] NextiveJson-delicious_popular.json 0.234
2011-11-24 14:49:05.072 JSONPerfTest[9716:207] NSJSONSerialization-delicious_popular.json 0.168
2011-11-24 14:49:05.434 JSONPerfTest[9716:207] SBJSON-yelp.json 0.361
2011-11-24 14:49:05.633 JSONPerfTest[9716:207] YAJL-yelp.json 0.198
2011-11-24 14:49:06.154 JSONPerfTest[9716:207] TouchJSON-yelp.json 0.519
2011-11-24 14:49:06.310 JSONPerfTest[9716:207] JSONKit-yelp.json 0.155
2011-11-24 14:49:06.497 JSONPerfTest[9716:207] NextiveJson-yelp.json 0.186
2011-11-24 14:49:06.637 JSONPerfTest[9716:207] NSJSONSerialization-yelp.json 0.140

 
将上面的数据整理成下面的图表:
 

测试的结果显示,系统的API的解析速度最快,我们在工程项目中选择使用,也是应用较为广泛的SBJSON的解析速度为倒数第二差,令我大跌眼镜。
与系统API较为接近的应该是JSONKit。
 
这里没有对API的开放接口和使用方式进行比较,若单纯基于以上解析速度的测试:
1:iOS5应该选择系统的API进行
2:不能使用系统API的应该选择JSONKit
 
附件是程序源码和本文word文档。