Upgrade to Pro — share decks privately, control downloads, hide ads and more …

作って理解するGOCACHEPROG / Go Conference 2025(Workshop)

Avatar for mazrean mazrean
September 27, 2025

作って理解するGOCACHEPROG / Go Conference 2025(Workshop)

Go 1.24でリリースされたGoコマンドの機能にGOCACHEPROGがあります。
この機能を利用することでGoのコンパイル時のキャッシュを自作プログラムでカスタマイズでき、端末を跨いでキャッシュを共有することなどが可能になります。
一方で、GOCACHEPROGバックエンドの実装は愚直な実装ではオーバーヘッドが大きく、場合によってはキャッシュが存在しない場合よりもコンパイルが多くなってしまうことすらあります。
本ワークショップでは、実際にGOCACHEPROGバックエンド実装を行うことでGOCACHEPROGについて理解を深めます。そして、オーバーヘッドを減らすために必要な工夫を議論・理解することで、実用に耐えるGOCACHEPROGバックエンド実装を行うことができるようになります。

Avatar for mazrean

mazrean

September 27, 2025
Tweet

More Decks by mazrean

Other Decks in Programming

Transcript

  1. ActionとOutput goコマンドでのキャッシュ管理の概念 ▪ Action: コンパイルの段階 • 各パッケージのコンパイルなど • Actionごとにキャッシュ ▪

    Output: Actionの成果物 • パッケージのコンパイル結果など • キャッシュの実体データとなる 17
  2. Get・Putの入出力 ▪ Get(取得): ActionをもとにOutputを取得 • 入力: ActionID • 出力: Outputの保存ファイル

    ▪ Put(保存): Actionに対応するOutputを保存 • 入力: ActionID、Output • 出力: Outputの保存ファイルなど 18
  3. データの保存方法 2種類のデータを保存 ▪ メタデータ: Actionに関する情報 • ActionIDでファイル名決定( {{ActionID}}-a.json ) •

    中身はActionに紐づくOutputのIDなど • 今回はjsonで保存 ▪ キャッシュデータ: Outputの本体データ • OutputIDでファイル名決定( {{OutputID}}-d ) • 中身はキャッシュデータ本体 19
  4. 実装してみよう! リポジトリのstep 1説明を見て実装する 1. PutHandler 実装 2. GetHandler 実装 3.

    動作確認 4. 発展1:リクエスト・レスポンスを見る 5. 発展2: リクエストのパースの処理を読む 22
  5. やること リポジトリのstep 2説明を見て実装する 1. PutHandler 実装 2. GetHandler 実装 3.

    動作確認 4. 発展1: 実行時間を比較する 5. 発展2: 速度のボトルネックを調査する 27
  6. やること 1. 個人での調査: 5分 • ハードウェアリソース足りているか? • 内部的に詰まっている箇所はないか? 2. ボトルネック議論:

    5分 • 1人1分弱で思ったことを1人ずつ言っていく • ボトルネックを1つに絞り込む 3. 改善案議論: 5分 • 2. で見つけたボトルネックの解決策を議論する 34
  7. ボトルネック go buildからのリクエスト数 がボトルネック ▪ 同時に$GOMAXPROCS個のみ • request.txt の動きが不自然 ▪

    歴史的経緯でこのようになっている • GOCACHEPROG以前はCPUが処理のネック • コア数以上の並列数があっても意味がない 36