Releases: alibaba/fastjson
1.1.48-android发布,进一步提升在android环境下的性能
进一步提升在android环境下的性能,同时减少内存占用,恢复Stream API,更好兼容之前的版本,jar大小196k,比上一个版本fastjson-1.1.47.android小1k。
Bug Fixed
- 修复引起的字段类型为java.lang.Long大于Integer.MAX_VALUE后变负数的bug,这个bug是1.1.47.android优化引入的,之前不存在,所以使用1.1.47.android的同学建议尽快升级。 github issue 534。
- 修复WriteClassName时,无法处理Collections.emptyMap序列化后的json串, github issue 536
- 修复字符串长度为0时parseArray报错的问题,改为返回null。
- 回复JSONReader/JSONWriter等stream api,增强和之前版本的兼容性。
性能改进
- 重写SymbolTable类,结构更简单,并且达到之前版本一样的性能。
- 减少内存驻留和提升性能,
- 使用排序好的数组代替Map保存FieldDeserializer
- 减少不必要分配的对象
- 常量数组按需分配大小,包括SerializeWriter的specicalFlags_doubleQuotes/specicalFlags_singleQuotes/replaceChars。
- 进一步提升了序列化反序列化的性能。优化的办法包括:
- 手动内联减少方法调用
- 构造字符串类型的值时使用local buf,减少内存分配。
- 使用ThreadLocal缓存char[] buffer,不再使用SoftReference,减少调用层次。
相关链接
- 下载 http://repo1.maven.org/maven2/com/alibaba/fastjson/1.1.48.android/
- 文档 https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
- 源码 https://github.com/alibaba/fastjson/tree/1.1.48-android
性能测试
测试机器 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);
}
1.1.47-android
Android环境下性能大幅度提升,减少内存占用,jar包大小不足200k。
1. 性能优化。
1.1.47-android针对android做了很多性能优化,性能优化包括首次序列化/反序列化,在android环境,序列化的次数较少,不如服务器端多,在此版本中,针对首次序列化和反序列化做了优化大幅提升了性能,当然常规的优化也做了很多。
优化的办法包括:
- 减少getAnnotation/getGenericType等耗时方法的调用。
- 减少方法调用,android的内联优化做得不好,方法调用的开销比oracle jvm大得多。减少方法调用的技巧包括:使用成员变量减少方法重复调用,使用field代替getter/setter,合并小方法。
- 迁移在非android版本的通过字节码生成实现的优化算法,对key采用比较而不是读出key对象的方法,反序列化能减少一半对象创建,从而能大幅提升性能。
- 采用Field的getInt/getLong/setInt/setLong/setBoolean/setFloat/setDouble等方法,减少序列化/反序列化过程中原生类型(boolean/int/long/float/double)对象的box/unbox的开销。
2. 功能增强
- 日期反序列化能自动识别YYYY-MM-DDTHH:mm:ss.sssZ和YYYY-MM-DDTHH:mm:ssZ这两种格式。
3. 功能裁剪。
这个版本去掉了android版本不常用的stream api,去掉了stream api的JSONReader/JSONWriter相关实现。
4. 性能测试
测试机器 OPPO R7 plusm 处理器高通MSM8939八核 运行内存3GB
Android版本 5.1.1
测试代码 https://github.com/alibaba/fastjson/tree/1.1.47-android/src/test/java/com/alibaba/json/test/benchmark
测试数据
首次序列化 | 首次反序列化 | 非首次序列化 | 非首次反序列化 | |
---|---|---|---|---|
gson-2.6.2 | 5205 | 4897 | 1881 | 1486 |
fastjson-1.1.46-android | 3898 | 3564 | 1174 | 1824 |
fastjson-1.1.47-android | 1280 | 2168 | 723 | 871 |
1.2.8
1.2.4
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.4</version>
</dependency>
Release notes:
- 修复map为空,开启SerializerFeature.WriteClassName时,反序列化失败的问题。
- 修复TypeUtils从数值型的负数转换成Date失败的问题。
- 修复反序列化ISO8601格式的UTC时间失败的问题。
- 当对象实现了泛型接口,并且泛型继承自其他类型,修复此类对象在jdk1.7和jdk1.8中反序列化失败的问题(此问题在jdk1.6中不存在)。
- Feature.OrderedField支持对每一层的key按照字符串顺序进行反序列化。