pprof でひたすら潰していった。html/template のリフレクションを丁寧に潰すのが地味に効く (funcMap 呼ぶのが本当に遅いみたい)
一通りやったので `hey -z 5s -c 20` (20並列 5秒) でそれぞれのエンドポイントのスループットを測った結果出してみた。マシン性能で数字が変わっちゃうので、静的ファイルに対しての係数も出してみた。
フィードは encoding/xml で、思ったよりすごく早くてびっくり。個別ページとトップページが html/template で、レンダリング後のキャッシュは入れてないので毎回出している。
基準値: 静的ファイル配信 (/images/github.svg) = 0.3ms (コスト係数 1.0)
┌──────────────────────┬────────────────────────┬───────────────────┬───────────────────────┐
│ ページ種別 │ スループット (req/sec) │ 平均処理時間 (ms) │ コスト係数 (静的=1.0) │
├──────────────────────┼────────────────────────┼───────────────────┼───────────────────────┤
│ 静的ファイル │ 59,240 │ 0.3 │ 1.0 │
│ OGP (キャッシュあり) │ 48,695 │ 0.4 │ 1.3 │
│ フィード │ 7,143 │ 2.8 │ 9.3 │
│ 個別ページ │ 4,958 │ 4.0 │ 13.3 │
│ トップページ │ 2,305 │ 8.7 │ 29.0 │
│ OGP (キャッシュなし) │ 1,644 │ 12.1 │ 40.3 │
└──────────────────────┴────────────────────────┴───────────────────┴───────────────────────┘
指標の解説
* 平均処理時間 (ms): hey で計測された平均レイテンシです。
* コスト係数: (各ページの平均処理時間) / (静的ファイルの平均処理時間) で算出。
* 例: トップページ(8.7ms)は静的配信(0.3ms)の 29倍 の時間を要しており、そのマシンの性能によらず「静的ファイル29個分の重さがある」という実装の相対的な複雑さを示します。
実際はサーバのネットワークがボトルネックになる。