FASTJSON 2.0.54 版本发布,性能进一步提
这又是一个性能优化Bug修复的版本更新版本,大家按需升级。
1. 性能优化
这个版本的性能优化包括:
1.1 使用SWAR(SIMD Within A Register)技巧来优化序列化字符串的性能
序列化时,写字符串检测是否存在特别字符是一个性能关键点,这个版本使用SWAR(SIMD Within A Register)的技巧来做快速检测。如下
package com.alibaba.fastjson2; class JSONWriterUTF8 { protected final long byteVectorQuote; JSONWriterUTF8(Context ctx) { // " -> 0x22, ' -> 0x27 this.byteVectorQuote = this.useSingleQuote ? 0x2727_2727_2727_2727L : 0x2222_2222_2222_2222L; } public void writeStringLatin1(byte[] value) { final long vecQuote = this.byteVectorQuote; int i = 0; final int upperBound = (value.length - i) & ~7; // 这里一次检测8个byte是否存在特别字符 for (; i < upperBound; i += 8) { if (containsEscaped(IOUtils.getLongLittleEndian(value, i), vecQuote)) { break; } } // ... } static boolean containsEscaped(long v, long quote) { /* for (int i = 0; i < 8; ++i) { byte c = (byte) data; if (c == quote || c == '\\' || c < ' ') { return true; } data >>>= 8; } return false; */ long x22 = v ^ quote; // " -> 0x22, ' -> 0x27 long x5c = v ^ 0x5c5c5c5c5c5c5c5cL; x22 = (x22 - 0x0101010101010101L) & ~x22; x5c = (x5c - 0x0101010101010101L) & ~x5c; return ((x22 | x5c | (0x7F7F_7F7F_7F7F_7F7FL - v + 0x1010_1010_1010_1010L) | v) & 0x8080808080808080L) != 0; } }
1.2 优化在JDK 16+的readString性能
在JDK 16+的版本下,使用StringLatin1.indexOfChar方法加速扫描特殊字符,优化readString的性能。这个算法来自 wycst 的贡献。
class JSONReaderASCII { static final int ESCAPE_INDEX_NOT_SET = -2; protected int nextEscapeIndex = ESCAPE_INDEX_NOT_SET; public String readString() { int slashIndex = nextEscapeIndex; if (slashIndex == ESCAPE_INDEX_NOT_SET || (slashIndex != -1 && slashIndex < offset)) { nextEscapeIndex = slashIndex = IOUtils.indexOfChar(bytes, '\\', offset, end); } if (slashIndex == -1 || slashIndex > index) { valueLength = index - offset; offset = index; // ... } }
- 获取StringLatin1.IndexOfChar MethodHandle的代码 https://github.com/alibaba/fastjson2/blob/2.0.54/core/src/main/java/com/alibaba/fastjson2/util/JDKUtils.java#L342
1.3 int/long/float/double的读取写性能
优化的技巧是一次性读取两个数字,如下:
package com.alibaba.fastjson2; class JSONReaderUTF8 { public final int readInt32Value() { // ... while (inRange && offset + 1 < end && (digit = IOUtils.digit2(bytes, offset)) != -1 ) { // max digits is 19, no need to check inRange (result == MULT_MIN_100 && digit <= (MULT_MIN_100 * 100 - limit)) if (inRange = (result > INT_32_MULT_MIN_100)) { result = result * 100 - digit; offset += 2; } } } }
package com.alibaba.fastjson2.util; class IOUtils { public static int digit2(byte[] bytes, int off) { short x = UNSAFE.getShort(bytes, ARRAY_BYTE_BASE_OFFSET + off); if (BIG_ENDIAN) { x = Short.reverseBytes(x); } int d; if ((((x & 0xF0F0) - 0x3030) | (((d = x & 0x0F0F) + 0x0606) & 0xF0F0)) != 0 ) { return -1; } return ((d & 0xF) << 3) + ((d & 0xF) << 1) // (d & 0xF) * 10 + (d >> 8); } }
这个优化最初灵感源泉来自 https://github.com/wycst/wast 的 io.github.wycst.wast.json.JSONTypeDeserializer.NumberImpl#deserializeInteger所采用的算法,然后做了进一步的改进。
2. Issues
- 修复toJSONString实际可用空间小于预设的问题 #255
- 格式化输出支持使用空格代替Tab,新增两个JSONWriter.Feature为PrettyFormatWith2Space和PrettyFormatWith4Space
- 修复非法输入缺少第一个花括号
{
不报错的问题 #2592 - 增强识别枚举,原来不能识别toString的结果,新增识别toString的结果。 #2820
- JSONObject.to 支持Void.class和void.class返回null #2879
- 修复CSVWriter写入CSV数据超过 65536 个字节时报错 #2988
- 修复SeeAlso类型父类是Abstract类型时JVM Crash的问题 #2987
- 修复初始化JSONFactory某些场景会导致循环依赖导致死锁的问题 #2994
- 修复JSON.toJSON方法行为和JSON.toJSONString不一致的问题 #2981
- 增强对注释的支持 #2983
- 修复某些场景JSONWriter.Feature.WriteNulls导致Long/Double序列化结果为Null的问题 #3049
- 修复toJavaObject方法不能识别早期时间毫秒到LocalDateTime的转换问题 #3091
- 修复反序列化private Class结果和toJavaObject方法结果不一致的问题 #3134
- 增强fastjson 1.x的兼容性 #3208 #2739 # 3144 #3157
- 增强对Record的支持 #3090
- JSONPath支持使用path设置List中的对象 #3125
- 修复private Boolean类型字段使用valueFilter报错的问题 #3076
- 修复JDK 9+ writeStringEscaped某些场景数组越界报错 #3209
- 增加对Key为Map类型的反序列化支持 #3214
- JSON.parseObject方法在某些情况下反序列化编码出错的问题 #3223 #3219
- 支持修改useGsonAnnotation 配置 #3258
fastjson2缺省是能识别Gson的Annotation的,这个可以通过接口或者JVM启动参数关闭
import com.alibaba.fastjson2.JSONFactory; // 手工关闭 JSONFactory.setUseGsonAnnotation(false);
也支持通过JVM启动参数关闭
-Dfastjson2.useGsonAnnotation=false
- 修复错误格式没有及时报错的问题 #3260
MAVEN依赖配置
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.54</version> </dependency>
- android5针对优化版本
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.54.android5</version> </dependency>
- android8针对优化版本
这个版本支持java.time和Optional
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.54.android8</version> </dependency>
- 1.x 兼容版本
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.54</version> </dependency>
- Spring 5 extension配置
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension-spring5</artifactId> <version>2.0.54</version> </dependency>
- Spring 6 extension配置
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-extension-spring6</artifactId> <version>2.0.54</version> </dependency>
3. 相关链接
- FASTJSON 1.x用户升级指南 https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
- 相关issues https://github.com/alibaba/fastjson2/milestone/54
- 代码tag https://github.com/alibaba/fastjson2/tree/2.0.54
- Maven下载 https://repo1.maven.org/maven2/com/alibaba/fastjson2/fastjson2/2.0.54/
- Android5特别优化版本 https://repo1.maven.org/maven2/com/alibaba/fastjson2/fastjson2/2.0.54.android5/
- Android8特别优化版本 https://repo1.maven.org/maven2/com/alibaba/fastjson2/fastjson2/2.0.54.android8/
- 1.x兼容版本 https://repo1.maven.org/maven2/com/alibaba/fastjson/2.0.54/
- 性能测试报告 https://github.com/alibaba/fastjson2/blob/main/docs/benchmark/benchmark_2.0.54.md

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
凹语言 v0.20.0 发布, 支持 Dora SSR 游戏开发
经过凹语言开发组的努力,凹语言v0.20.0发布, 支持Dora SSR游戏开发(给凹语言编写游戏引擎绑定的故事) 补充带文字 logo 种子案例: 实验性支持Dora SSR游戏开发:https://github.com/IppClub/dora-wa 支持 github action 自动化构建:https://github.com/wa-lang/setup-wa 修复方法重载处理问题, 支持链式调用 修复 wa fmt 对匿名结构体成员格式化的问题 完善 println 打印复数 完善wat2c子命令 https://wa-lang.org/
- 下一篇
Syncthing v1.29.1 发布,连续文件同步工具
Syncthing是一个免费开源的工具,它能在你的各个网络计算机间同步文件 / 文件夹,它的同步数据是直接从一个系统中直接传输到另一个系统的,并且它是安全且私密的。 Syncthing v1.29.1 现已发布,具体更新内容如下: Bug 修复 #9904:自 Syncthing v1.29.0 起,browse API 响应已发生改变 #9906:偶尔会随机发生死锁 #9907:自 Syncthing v1.29.0 起,“pending” API 的响应已发生变化 #9909:Login into UI(Browser)不再起作用 更新说明:https://github.com/syncthing/syncthing/releases/tag/v1.29.1
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7设置SWAP分区,小内存服务器的救世主
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群