コメントを投稿するにはログインが必要です
ログインページへ記事ができると、章ごとの要約と、聴きどころへ飛べる目次がここに並びます。いまは音声で聴けます。
go-jsonは、Go標準の`encoding/json`と互換のインターフェースを持つ高速なJSONライブラリです。今回は作者のgoccyさんをゲストに迎え、主にエンコーダの高速化の仕組みを深掘りしました。
開発のきっかけは、ブラウザゲームのサーバーで大量のJSONを返す際に、エンコードがボトルネックになったことでした。json-iterator/goへの置き換えでも十分な改善が得られず、自ら実装に取り組みます。
go-jsonの中心にあるのは、型ごとにOpcode(命令列)を生成・キャッシュし、VM(バーチャルマシン)で実行する仕組みです。関数呼び出しを繰り返す代わりに、巨大なswitch-caseで命令を処理します。ジャンプテーブルへのコンパイルをアセンブリで確認する方法や、caseの配置によってベンチマーク結果が変動する問題など、低レイヤーの最適化について詳しく聞きました。
さらに、`reflect`のヒープへの強制エスケープを回避するために利用していた`go:linkname`の話へ。標準ライブラリの非公開APIへの依存がGo本体の開発を妨げる事例として、2024年にRuss CoxさんのIssueでgo-jsonが名指しされました。この問題を背景にGo 1.23では`go:linkname`への制限が強化され、Goのソースコードには今もgo-jsonの名前が残っています。
2026年9月のv0.11.0では、コーディングエージェントも活用しながら`go:linkname`を全面的に削除。Go 1.21での`reflect`の改善に加え、`typelinks`を使ったキャッシュをオープンアドレス法のハッシュテーブルに置き換え、読み出しをロックフリーに保ちながらメモリ使用量と性能を改善しました。その結果、bytedance/sonicを上回るベンチマーク結果も得られています。
後半では、さらに高速なvelox-io/jsonの実装にも注目します。Cで記述したVMをELFとして埋め込み、GCCのcomputed gotoで命令を直接ディスパッチする方式です。こうした手法との比較を踏まえ、`encoding/json/v2`への対応やeasyjsonのようなコード生成方式など、go-jsonの今後についても議論しました。
JSONライブラリの内部実装から、ベンチマークとプロファイリングの向き合い方、OSSの保守と設計判断まで。GoでJSONを扱う方や、ISUCONに参加する方にぜひ聞いてほしい回です。
## 関連リンク
- go-json: https://github.com/goccy/go-json
- go-json v0.11.0 リリースノート: https://github.com/goccy/go-json/releases/tag/v0.11.0
- go-json ベンチマークレポート: https://goccy.github.io/go-json/
- go-json Issue #573(velox-io/jsonとのベンチマーク比較): https://github.com/goccy/go-json/issues/573
- golang/go Issue #67401(cmd/link: lock down future uses of linkname): https://github.com/golang/go/issues/67401
- Goのreflect/type.goでgo-jsonに言及している箇所: https://github.com/golang/go/blob/c0be4674865b06f0be851e27cef93136708be506/src/reflect/type.go#L2836-L2846
- Go 1.21 Release Notes: https://go.dev/doc/go1.21
- Go 1.23 Release Notes: https://go.dev/doc/go1.23
- encoding/json/v2: https://pkg.go.dev/encoding/json/v2
- velox-io/json: https://github.com/velox-io/json
- velox-io/json アーキテクチャ解説: https://github.com/velox-io/json/blob/main/docs/arch_2_en.md
- bytedance/sonic: https://github.com/bytedance/sonic
- json-iterator/go: https://github.com/json-iterator/go
- easyjson: https://github.com/mailru/easyjson
- GCC Labels as Values: https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
─────────────
YouTube: https://youtu.be/kYi8VVimHAE
Web: https://yaoyorozu-oss.henteko07.com/
X: https://x.com/yaoyorozu_oss