针对高性能esb产品基础库的需要,针对特殊的轻量树型数据结构的json解析器开发完毕。解析器采用状态机理论实现。经过针对不同大小的json数据的测试,总体性能算是基本满意,通过与json-lib和jackson库的比较,总体性能还算满意,尽管经过MAT内存分析,内存使用率相比个人期望还是有一点点偏高,这个带今后有优化需求时再说了,暂时先这样了。
json-lib公认为最差的解析器,在性能对比测试中证实,性能真的是太差了,不知道代码实现上是怎么做的,也不想研究了。我的json解析器的性能,在17K的json解析上,无论速度还是内存使用率,均是json-lib的20倍以上。
在于jackson的对比测试中,采用jackson的treemodel与我的解析器对比:
1. json string->tree: jackson比我的稍稍快了一点,17k的json,我的用了442微秒,jackson用了373微秒,内存使用上,jackson也略胜一筹。(相信我的解析器如果进一步优化一下内存,主要是string的使用,应该可以达到与jackson同等水平)
2. tree->jackson:我的解析器大大超越jackson。jackson用了大概800微秒,我的解析器用了450微秒,内存使用率,我的解析器也是jackson的1/2左右。(没去看jackson的代码,说下我的做法,我的解析器在toString时,采用stringbuffer拼接,在生成stringbuffer对象时,先计算了下json string的近似值,避免string buffer的频繁延展。不知道是不是这个原因在内存使用率上略占优于jackson。)
总体来看,jackson的解析性能确实很快,不过再输出string时确实有优化的地方(也不排除是否我使用的是正确的方法,我用的是rootNode.toString()方法。)
另外说一句,之前也实现了一个基于轻量树模型的xml解析器,与json解析器对比来看,在解析速度和内存使用率上,xml好像占优,json解析反而比较复杂。(由于json具备数组和对象两种结构,设计上用了2个状态机模型,解析过程中不同层级对象或数组是通过状态机调用状态机方式进行的)。不过json比xml的优势是在网络传输上和浏览器客户端javascript操作的便利性上。
补充一下小json数据的测试,选用200字节json:
json string -> tree: jackson用了3355B, 用时14微秒,我的解析器用了2013B,用时7微秒。
tree -> json string: jackson用了7382B, 用时11微秒,我的解析器用了3355B,用时17微秒。