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、修复嵌套类型最后一个字段是字符串数组并且存在多余空格时反序列化错误的bug。#504
2、直接支持oracle.sql.DATE和oracle.sql.TIMESTAMP两种类型序列化。#503
3、支持中文getter/setter方法名。#502
4、在SerializerFeature.BrowserCompatible打开时,将特大整数变成字符串展示,在javascript中不丢失精度。#498
5、反序列化时支持C风格的字符串。#487
6、支持Builder模式。https://github.com/alibaba/fastjson/wiki/BuilderSupport
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按照字符串顺序进行反序列化。