概要
- V8エンジン のJSON.stringifyが 2倍以上高速化
- 副作用のない 新しい高速パス の導入
- 文字列・数値変換・バッファ管理の 最適化
- 一般的なユースケースで 自動的に恩恵
- V8 13.8(Chrome 138) から利用可能
JSON.stringify高速化の技術的最適化
- JSON.stringify はJavaScriptの中核的なデータシリアライズ関数
- ネットワーク通信やlocalStorage保存など Web全体のパフォーマンス に影響
- V8エンジンでの 大幅な高速化 により、ページ応答性・操作性向上
副作用フリーの高速パス
- 副作用 のない場合に特化した 新しい高速パス を実装
- 副作用=ユーザー定義コード実行やGC発生など、シリアライズ処理を妨げる要素
- 副作用がなければ 高効率な専用処理 を適用し、従来の高コストなチェックを回避
- 反復的(イテレーティブ)実装 により、スタックオーバーフロー対策不要・深いネストも対応
文字列表現ごとの最適化
- V8の文字列は 1バイト(ASCII) または 2バイト(非ASCII) で管理
- 文字種ごとに テンプレート化 し、1バイト・2バイト用に 最適化バージョン を用意
- 文字列の種類を判定し、 必要に応じてシリアライザを切替
- 一般的なケースで 最適化パス を維持、2バイト対応も軽量に実現
SIMDによる文字列シリアライズ高速化
- JSONシリアライズ時、 特殊文字("や\)のエスケープ が必要
- 長い文字列には ハードウェアSIMD命令(例:ARM64 Neon) を活用し、複数バイトを一括処理
- 短い文字列には SWAR(SIMD Within A Register) 技法で汎用レジスタを活用
- どちらも チャンク単位で高速スキャン、特殊文字がなければ一括コピー
エクスプレスレーン(超高速経路)の導入
- オブジェクトのプロパティ確認処理を hidden class のフラグで最適化
- 全プロパティが Symbolでなく、列挙可能、エスケープ不要 であれば「fast-json-iterable」マーク
- 同じhidden classを持つオブジェクトは 追加チェックなしでキーを一括コピー
- JSON.parse にも同様の最適化を適用、配列内の同型オブジェクトで高速化
数値→文字列変換の高速化
- 数値の文字列化は 性能上のボトルネック
- Grisu3アルゴリズム から Dragonbox へ置換し、最短表現の高速化
- Number.prototype.toString() にも恩恵、全体的な数値変換の高速化
バッファ管理の最適化
- 以前は C++ヒープ上の連続バッファ で出力を構築
- バッファ拡張時の 再割り当て&全コピー が大きなオーバーヘッド
- 新方式は セグメント化バッファ を採用、Zoneメモリで小分け管理
- セグメント満杯時は新規割当てし、 高コストなコピーを排除
制限事項
- replacer関数やspace引数 を指定すると高速パス非対応
- .toJSON()メソッド を持つオブジェクトやプロトタイプは一般パスにフォールバック
- インデックス付きプロパティ を持つオブジェクトも非対応
- ConsString など一部内部文字列型は高速パス非対応
- 通常のAPIレスポンスや設定キャッシュなど 多くのユースケースで自動的に最適化
まとめ
- JSON.stringifyの根本的な再設計 により、JetStream2ベンチマークで 2倍以上の高速化 を達成
- これらの最適化は V8 13.8(Chrome 138) 以降で利用可能
- Web開発者は追加の対応不要 で自動的に恩恵を享受