新版 Go JSON API:快两倍还是慢 1.5 倍?Daniel Lemire 的实测基准
来源: lemire.me — 2026-08-29
概述
Daniel Lemire 对 Go 1.27 引入的新 JSON 包 encoding/json/v2 做基准实测。标准库里新出现的 json/v2 与原 API 长得几乎一样,但两者在 Unicode 校验、大小写敏感等语义上有差异,并非直接可替换;同时原编码/json 也被重实现了新引擎之上(可用 GOEXPERIMENT=nojsonv2 切回旧实现),于是实际有三种组合。他沿用 twitter.json、canada.json、citm_catalog.json 三个 simdjson 文档,在 Apple M4 Max 与 Intel Xeon(Emerald Rapids)上单核解到 any(interface{})测中位数。结论:仅升级到 Go 1.27 不改一行代码,序列化就能快达两倍;改用新 API 收益更大——反序列化快 1.5~2.3 倍、序列化快 1.2~3 倍。有趣的是 legacy API 在新引擎上跑 canada.json 反而略慢(128→106 MB/s),所以「快两倍还是慢 1.5 倍」取决于文档形态与 API 组合。
核心要点
- Go 1.27 默认提供新 JSON 包 encoding/json/v2,原 encoding/json 也重实现到新引擎之上,形成三种组合
- 仅升级到 Go 1.27 不改一行代码,序列化最多可快约两倍(twitter.json 198→374 MB/s)
- 改用 json/v2 收益更大:反序列化快 1.5~2.3 倍、序列化快 1.2~3 倍
- 结果依赖文档形态:legacy 跑 canada.json 反而变慢(128→106 MB/s)
- 新 API 序列化少做的工作更多,是序列化提速的重要组成部分
金句
So merely upgrading to Go 1.27, without changing a line of code, should make marshalling faster.(仅仅升级到 Go 1.27、一行代码都不改,序列化就应该更快。)
👍 0
👎 0
返回 Lobsters 首页