FASTJSON性能优化

##序列化

  • IdentityHashMap缓存各种序列化处理类,包括各种基本对象、集合对象、第三方对象、自定义对象,方便序列化处理类的快速查找、避免JavaBeanSerializer的反复创建。

代码地址

  • 使用ThreadLocal来存储序列化过程中不断append的字符串,减少内存分配和gc,从而提高性能。
  • 用类StringBuilder方式进行字符串操作,配合ThreadLocal实现线程安全的StringBuilder。
  • 代码地址

  • 缺省启用sort field输出,为deserialize优化做准备。 具体为什么开启了排序的输出能够提升对象还原(反序列化)的效率,请查阅下面反序列化的“快速匹配”。
  • 使用asm高效反射,fastjson-asm基于objectweb asm 3.3.1改造,只保留必要的部分,不到2000行代码。[具体代码](https://github.com/alibaba/fastjson/tree/master/src/main/java/com/alibaba/fastjson/asm) ##反序列化
    1. IdentityHashMap缓存各种反序列化处理类,包括基本对象、集合对象、第三方对象、自定义对象,方便反序列化类的快速查找、避免JavaBeanDeserializer的反复创建。代码与序列化的处理类缓存相似,具体请参考:https://github.com/alibaba/fastjson/blob/master/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
  • 读取token基于预测。在反序列化一个json字符串时,下一个字符一般情况下是可以预估的。比如字符}之后最有可能出现的是“,”、“]”、“}”或者结束符,有计划、有预测地判断token将能提升不少性能。于是Fastjson在实现的时候写了这样一个函数:

  • 代码

  • 快速匹配.在Fastjson反序列化过程中,有一个非常有用的效率改进方法是有序json的快速匹配。所谓有序json就是json字符串中的key是按照字符排序好了的。上面已经说过,Fastjson的序列化默认是按照key的顺序进行的,因此做反序列化时候,Fastjson采用一种优化算法,就是假设key/value的内容是有序的,读取的时候只需要做key的匹配,而不需要把key从输入中读取出来。通过这个优化,使得Fastjson在处理json文本的时候,少读取超过50%的token,这个是一个十分关键的优化算法。基于这个算法,使用asm实现,性能提升十分明显,超过300%的性能提升。
  • {"id":123,"name":"testJson","salary":11}
    

    在上面例子看,虚线标注的三个部分是key,如果key_id、key_name、key_salary这三个key是顺序的,就可以做优化处理,这三个key不需要被读取出来,只需要比较就可以了。


    这种算法分两种模式,一种是快速模式,一种是常规模式。快速模式是假定key是顺序的,能快速处理,如果发现不能够快速处理,则退回常规模式。保证性能的同时,不会影响功能。在这个例子中,常规模式需要处理13个token,快速模式只需要处理6个token。实现代码片段如下:


    代码

  • symbolTable算法缓存关键字,避免创建新的字符串对象。试想一下,假设一个json字符串中,有成千上万个同样的json对象的数组,那么在转换过程中,如果不对这些json对象中的key做缓存,将会存在成千上万个同样的字符串对象(值相同),显然这样会浪费极大的内存和性能。于是Fastjson写了一个SymbolTable类来缓存这些临时字符串符号变量。

  • 代码

    你可能感兴趣的:(java)