github alibaba/fastjson 1.1.48-android
1.1.48-android发布,进一步提升在android环境下的性能

latest releases: 1.2.83, 1.2.80, 1.2.79...
8 years ago

进一步提升在android环境下的性能,同时减少内存占用,恢复Stream API,更好兼容之前的版本,jar大小196k,比上一个版本fastjson-1.1.47.android小1k。

Bug Fixed

  1. 修复引起的字段类型为java.lang.Long大于Integer.MAX_VALUE后变负数的bug,这个bug是1.1.47.android优化引入的,之前不存在,所以使用1.1.47.android的同学建议尽快升级。 github issue 534
  2. 修复WriteClassName时,无法处理Collections.emptyMap序列化后的json串, github issue 536
  3. 修复字符串长度为0时parseArray报错的问题,改为返回null。
  4. 回复JSONReader/JSONWriter等stream api,增强和之前版本的兼容性。

性能改进

  1. 重写SymbolTable类,结构更简单,并且达到之前版本一样的性能。
  2. 减少内存驻留和提升性能,
    • 使用排序好的数组代替Map保存FieldDeserializer
    • 减少不必要分配的对象
    • 常量数组按需分配大小,包括SerializeWriter的specicalFlags_doubleQuotes/specicalFlags_singleQuotes/replaceChars。
  3. 进一步提升了序列化反序列化的性能。优化的办法包括:
    • 手动内联减少方法调用
    • 构造字符串类型的值时使用local buf,减少内存分配。
    • 使用ThreadLocal缓存char[] buffer,不再使用SoftReference,减少调用层次。

相关链接

性能测试

测试机器 OPPO R7 plusm 处理器高通MSM8939八核 运行内存3GB
Android版本 5.1.1
测试代码 https://github.com/alibaba/fastjson/tree/1.1.48-android/src/test/java/com/alibaba/json/test/benchmark

首次序列化(1000次) 首次反序列化 (1000次) 非首次序列化 (10000次) 非首次反序列化(10,000次)
gson-2.6.2 5252 4813 1834 1471
fastjson-1.1.46.android 3622 3269 1050 1707
fastjson-1.1.47.android 1197 2052 659 813
fastjson-1.1.48.android 1177 1888 503 758
android原生org.json手工 1162 1206

注意,fastjson对key排序的序列化对象做算法特别优化的,服务端和客户端配套使用能得到更好的性能。另外自行构造别的测试case时切记。另外要说明的一点是,在fastjson中自动序列化/反序列化都要比手工构造速度要快。

测试样本是取自 https://github.com/eishay/jvm-serializers/blob/master/tpc/data/media.1.cks ,构造成json字符串487个字符,eishay/jvm-serializers是各个序列化库作者都比较认可的测试用例。具体如下:

{"image":[{"height":768,"size":"LARGE","title":"Javaone Keynote","uri":"http://javaone.com/keynote_large.jpg","width":1024},{"height":240,"size":"SMALL","title":"Javaone Keynote","uri":"http://javaone.com/keynote_small.jpg","width":320}],"media":{"bitrate":262144,"duration":18000000,"height":480,"format":"video/mpg4","size":58982400,"height":480["Bill Gates"][,"Steve Jobs"],"player":"JAVA","size":58982400,"title":"Javaone Keynote","uri":"http://javaone.com/keynote.mpg","width":640}]

fastjson/gson模拟首次序列化反序列化在这里:
https://github.com/alibaba/fastjson/blob/1.1.48-android/src/test/java/com/alibaba/json/test/codec/FastjsonSCodec.java
https://github.com/alibaba/fastjson/blob/1.1.48-android/src/test/java/com/alibaba/json/test/codec/GsonSCodec.java

fastjson 模拟首次

public <T> T decodeObject(String text, Type clazz) {
    return JSON.parseObject(text, // 
                            clazz, //
                            new ParserConfig(), // 每次new ParserConfig模拟首次
                            JSON.DEFAULT_PARSER_FEATURE, // 
                            Feature.DisableCircularReferenceDetect);
}

public String encode(Object object) throws Exception {
    return JSON.toJSONString(object, // 
                             new SerializeConfig(), // 每次new SerializeConfig模拟首次
                             SerializerFeature.DisableCircularReferenceDetect);
}

gson 模拟首次

public <T> T decodeObject(String text, Type clazz) {
    Gson gson = new Gson(); // 每次new Gson模拟首次
    return gson.fromJson(text, clazz);
}

public String encode(Object object) throws Exception {
    Gson gson = new Gson(); // 每次new Gson模拟首次
    return gson.toJson(object);
}

Don't miss a new fastjson release

NewReleases is sending notifications on new releases.