サイバーエージェントのカンファレンス参加学生支援プログラムでGo Conference 2025に参加しました。サポートいただいた株式会社サイバーエージェント様ありがとうございます。
Go言語の最新トレンドや内部実装に焦点を当てたセッションが多数あり、インターンでGoを使う開発者として非常に有意義な時間を過ごせました。ここでは特に印象に残った二つのセッションを振り返ります。全体を通して感じたのは、Goの進化がハードウェアの変化などに的確に追随しているということです。
1. encoding/json/v2で何が変わるか ~ v1からv2への変化を徹底比較 ~
Ubie株式会社のglassmonkey(永野峻輔)氏によるセッションでは、標準ライブラリencoding/jsonのv2が、v1からどのように進化するかが詳しく解説されました。従来のv1は手軽な一方で、大規模なJSONを扱う際にメモリを大量に消費し、ストリーミング処理に不向きという課題がありました。
v2ではトークンベースの逐次処理設計が導入され、io.Reader/io.Writerに直接対応することで、ストリーミング処理が現実的になり、メモリ効率が大幅に向上します。具体的には、MarshalWrite/UnmarshalReadといったストリーミングAPIやトークン単位の処理が中心となり、特に大容量データでその効果を発揮します。加えて、Unmarshalの挙動がより予測しやすくなるなど、型安全性の向上に関する改善も紹介されました。
一方で、タグの解釈やomitempty、nil周りの挙動が変わる点は、v1からの移行における注意点です。セッションでも移行検証の重要性が強調されており、既存コードに対して段階的な対応(差分検証など)が現実的な戦略だと感じました。公式ベンチマークでは速度向上やメモリ使用量の削減が報告されており、このセッションで学んだ移行アプローチは、今後のプロジェクトでも大いに参考になるはずです。
2. Green Tea Garbage Collector の今
株式会社Gaudiyのzchee(白石耕一)氏によるセッションでは、Go 1.25で実験的に導入された「Green Tea GC」が紹介されました。これは私が知っているJavaの世代別GCやTri-color Parallel Markingとは異なり、現代のCPUとDRAMの性能ギャップ(いわゆる「メモリの壁」問題)に対応するため、メモリ局所性を重視したアプローチを採用しています。
具体的には、8KiB単位のスパン(メモリブロック)を走査の基本単位とし、特に小さなオブジェクト(512バイト以下)に対して局所性を高める処理を行います。ワーカーはwork-stealingベースのrunqueueを用いてスパンをFIFO (Queue) で処理し、オブジェクトの密集性を活用する設計です。また、Representativeオブジェクトやgchitフラグにより、単一オブジェクトへのアクセス最適化も図られています。非公式ベンチマークでは、GCパフォーマンスの向上が確認できました。
今後はGo 1.26での安定化やSIMD(例:AVX512)活用などによるさらなる最適化が予定されています。セッションでは、GCを全面的に再設計するのではなく、ワーカー単位で部分的に改善を行うアプローチが説明されており、ワークロードによって効果が異なることがあるので導入時には十分な検証が必要であることを学びました。
まとめと感想
Go Conference 2025は、JSON処理、型システム、GCなどといったGoのコアな領域における現在地と未来を深く理解する絶好の機会でした。encoding/json/v2は「メモリ効率とストリーミング対応」、Green Tea GCは「メモリ局所性とランタイム最適化」をそれぞれ実現するものです。両セッションではベンチマーク結果のスライドが示されており、数値で改善が見えるのは技術選定の参考になって良かったです。普段は業務でGoを書いているものの、こうした内部の最適化の話を直接聞ける機会は貴重で、とても楽しかったです。今後の開発にも活かしていきたいと思います。