进一步提升在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);
}