新的 Go JSON API:快两倍,还是慢1.5倍?

Lobsters Hottest 工具

摘要

这篇文章对 Go 1.27 中的新 JSON API 进行了基准测试,显示在反序列化方面速度显著提升,但在序列化方面与旧实现相比结果不一。

<p><a href="https://lobste.rs/s/67ygvv/new_go_json_api_twice_as_fast_1_5x_slower">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/09/04 16:17

# 新版Go JSON API:速度加倍还是减慢50%? 来源:https://lemire.me/blog/2026/08/29/the-new-go-json-api-twice-as-fast-or-1-5x-slower/ JSON是数据交换的标准格式。它实质上是由对象和数组构成的JavaScript微小子集。其结构示例如下:`\{"key":1, "text":\[1\.0,2\.0\]\}`。 许多编程语言在标准库中包含了JSON处理库:C#、Go、Java(即将支持)、Python、JavaScript等。Go的JSON实现虽然便捷,但性能并非特别出色。 Go 1\.27版本在标准库中默认引入了新的JSON包(`encoding/json/v2`)。两个API的接口极为相似: `` import ( json "encoding/json" jsonv2 "encoding/json/v2" ) b, err := json.Marshal(v) b, err = jsonv2.Marshal(v) err = json.Unmarshal(b, &v) err = jsonv2.Unmarshal(b, &v) `` 两者并非直接对应,因其在Unicode校验、大小写敏感性等方面存在差异,因此不能作为直接替换方案。 不过,旧版API(`encoding/json`)也已基于新引擎重新实现。通过配置标志,您可以使用旧版API搭配新引擎或传统引擎(`GOEXPERIMENT=nojsonv2`)。因此存在三种组合方式: 1. *json(旧版)*——使用`GOEXPERIMENT=nojsonv2`构建的`encoding/json`,即原始实现 2. *json(Go 1\.27)*——Go 1\.27版本的`encoding/json`,即v1 API搭配v2后端 3. *json/v2*——`encoding/json/v2` 我沿用了常规的simdjson测试文档(https://simdjson.org/):`twitter\.json`(632 KB,包含短字符串键的嵌套对象)、`canada\.json`(2\.25 MB,大型坐标数组)和`citm\_catalog\.json`(1\.73 MB,包含数字键的嵌套对象)。我将它们解析为`any`(`interface\{\}`)类型,这是通用处理路径。 测试平台为Apple M4 Max与Intel Xeon Gold 6548N(Emerald Rapids),使用Go 1\.27\.0版本,单核运行(`GOMAXPROCS=1`),结果取八次运行的中位数。 [](https://lemire.me/blog/wp-content/uploads/2026/08/json-v1-v2.png) 反序列化方面,旧版API在新引擎上的性能在`twitter\.json`(172 MB/s提升至203 MB/s)和`citm\_catalog\.json`(186 MB/s提升至241 MB/s)上优于原始实现,但在`canada\.json`上速度下降(128 MB/s降至106 MB/s)。序列化方面则最高可实现双倍性能提升:`twitter\.json`从198 MB/s提升至374 MB/s。这意味着仅升级至Go 1\.27无需修改代码即可提升序列化效率。 改用新API能带来更显著的性能增益。与原始实现相比,`encoding/json/v2`的反序列化速度提升1\.5至2\.3倍,序列化速度提升1\.2至3倍。与Go 1\.27旧版API相比,反序列化性能再提升1\.8至2倍,而序列化增益相对较小(1\.0至1\.7倍):部分差异源于`json/v2`在序列化时执行的操作更少。 此前测试中,我将数据反序列化为`any`类型,即假设未知文档结构。我还对包含10,000个小型结构体的切片进行了往返测试: `` type Record struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` Active bool `json:"active"` Score float64 `json:"score"` Tags []string `json:"tags"` } `` 此时文档模式已明确:JSON必须符合`\[\{"id":\.\.\., "name":\.\.\.\}, \{"id":\.\.\., "name":\.\.\.\}\.\.\.\]`格式。测试结果显示新API仍能实现更快的反序列化,但旧版API搭配传统引擎在序列化时性能更优。[](https://lemire.me/blog/wp-content/uploads/2026/08/json-records.png) 原始实现的性能更优。Go 1\.27发布说明指出序列化性能与旧版基本持平,但我的测试结果与此不符。 综上所述,`encoding/json/v2`能全面提升反序列化性能,对`any`类型的序列化也有加速效果,但在我的测试中对类型化结构体的序列化速度反而降低约50%。 代码已公开。(https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/2026/08/29)

相似文章

Go JSON v2 迁移:Go 1.27 中有哪些破坏性变化

Lobsters Hottest

Go 1.27 在标准库中引入了 `encoding/json/v2`,并悄悄在它之上重新实现了旧的 `encoding/json` 包,从而改变了错误信息字符串,并调整了默认行为:nil 切片变为 `[]`、字段匹配改为大小写敏感、拒绝重复的 key,以及在直接导入 v2 时 `time.Duration` 不再进行序列化。

Go 1.27 发布 - Go 编程语言

Lobsters Hottest

Go 1.27 已发布,包含重大增强,如泛型方法、性能改进以及新标准库特性,例如 encoding/json/v2 和后量子密码学支持。

Go 1.27 中更好的 HTTP/1 连接复用

Hacker News Top

Go 1.27 显著改进了 net/http 包中的 HTTP/1 连接复用,通过避免不必要的新建 TCP/TLS 连接开销,使顺序执行的 HTTP/1 请求性能提升至近 5 倍。

Go 中的性能剖析引导优化

Lobsters Hottest

Daniel Lemire 对 Go 中的性能剖析引导优化(PGO)进行了基准测试,显示在解析 JSON 时速度提升约为 2-5%,当训练 profile 与工作负载匹配时效果最佳。

在ARM处理器上使用SVE2加速JSON解析

Lobsters Hottest

文章介绍了如何利用ARM处理器上的SVE2 SIMD指令,通过字符匹配指令来优化simdjson库中的JSON解析,从而实现更快的性能。