"Fastjson技术内情": fastjson技术内幕
文章来源:+fastjson
序列化时间
反序列化时间
大小
压缩后大小
java序列化
8654
43787
889
541
hessian
6725
10460
501
313
protobuf
2964
1745
239
149
thrift
3177
1949
349
197
avro
3520
1948
221
133
json-lib
45788
149741
485
263
jackson
3052
4161
503
271
fastjson
2595
1472
468
251
json协议使用方便,越来越流行。json的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的json parser,希望json parser的性能有二进制协议一样好,比如和protobuf一样,这可不容易,但确实做到了。有人认为这从原理上就是不可能的,但是计算机乃实践科学,看实际的结果比原理推导更重要。
这篇文章告诉大家:
* fastjson究竟有多快
* 为什么fastjson这么快
* 你能用fastjson来做什么!
* 如何获得fastjson?
首先,fastjson究竟有多快?
我们看一下使用https://github.com/eishay/jvm-serializers/提供的程序进行测试得到的结果:
这是一个468bytes的json bytes测试,从测试结果来看,无论序列化和反序列化,fastjson超越了protobuf,可以当之无愧fast! 它比java deserialize快超过30多倍,比json-lib快100倍。由于fastjson的存在,你可以放心使用json统一协议,达到文本协议的可维护性,二进制协议的性能。
json处理主要包括两个部分,serialize和deserialize。serialize就是把java对象变成json string或者json bytes。deserialize是把json string或者json bytes变成java对象。其实这个过程有些json库是分三部分的,json string <--> json tree <--> java object。fastjson也支持这种转换方式,但是这种转换方式因为有多余的步骤,性能不好,不推荐使用。
为什么fastjson能够做到这么快?
一、fastjson中serialzie的优化实现
此文来自: 马开东博客 转载请注明出处 网址:
1、读取token基于预测。
所有的parser基本上都需要做词法处理,json也不例外。fastjson词法处理的
java代码
从上面摘抄下来的代码看,基于预测能够做更少的处理就能够读取到token。
2、sort field fast match算法
fastjson的serialize是按照key的顺序进行的,于是fastjson做deserializer时候,采用一种优化算法,就是假设key/value的内容是有序的,读取的时候只需要做key的匹配,而不需要把key从输入中读取出来。通过这个优化,使得fastjson在处理json文本的时候,少读取超过50%的token,这个是一个十分关键的优化算法。基于这个算法,使用asm实现,性能提升十分明显,超过300%的性能提升。
java代码
在上面例子看,虚线标注的三个部分是key,如果key_id、key_name、key_salary这三个key是顺序的,就可以做优化处理,这三个key不需要被读取出来,只需要比较就可以了。
这种算法分两种模式,一种是快速模式,一种是常规模式。快速模式是假定key是顺序的,能快速处理,如果发现不能够快速处理,则退回常规模式。保证性能的同时,不会影响功能。
在这个例子中,常规模式需要处理13个token,快速模式只需要处理6个token。
实现sort field fast match算法的代码在这个类com.alibaba.fastjson.parser.deserializer.asmdeserializerfactory
,是使用asm针对每种类型的vo动态创建一个类实现的。
这里是有一个用于演示sort field fast match算法的代码:
java代码
3、使用asm避免反射
deserialize的时候,会使用asm来构造对象,并且做batch set,也就是说合并连续调用多个setter方法,而不是分散调用,这个能够提升性能。
4、对utf-8的json bytes,针对性使用优化的版本来转换编码。
这个类是com.alibaba.fastjson.util.utf8decoder,来源于jdk中的utf8decoder,但是它使用threadlocal cache buffer,避免转换时分配char[]的开销。
threadlocal cache的实现是这个类com.alibaba.fastjson.util.threadlocalcache。第一次1k,如果不够,会增长,最多增长到128k。
java代码
6、symboltable算法。
我们看xml或者javac的parser实现,经常会看到有一个这样的东西symbol table,它就是把一些经常使用的关键字缓存起来,在遍历char[]的时候,同时把hash计算好,通过这个hash值在hashtable中来获取缓存好的symbol,避免创建新的字符串对象。这种优化在fastjson里面用在key的读取,以及enum value的读取。这是也是parse性能优化的关键算法之一。
以下是摘抄自jsonscanner类中的代码,这段代码用于读取类型为enum的value。
java代码
我们能用fastjson来作什么?
1、替换其他所有的json库,java世界里没有其他的json库能够和fastjson可相比了。
2、使用fastjson的序列化和反序列化替换java serialize,java serialize不单性能慢,而且体制大。
3、使用fastjson替换hessian,json协议和hessian协议大小差不多一样,而且fastjson性能优越,10倍于hessian
4、把fastjson用于memached缓存对象数据。
如何获得fastjson
h3. 官方网站
fastjson是开源的,基于apache 2.0协议。你可以在官方网站了解最新信息。
maven用户
* maven仓库
java代码
downlaods
bin
搜索此文相关文章: