性能計測の実践テクニック
性能改善の第一歩は正確な計測です。このドキュメントでは、計測で使うツールと「何を見るか」を解説します。
計測の原則
推測するな、計測せよ
❌ 悪い例:
「DBが遅そうだからインデックス追加しよう」
→ 実際のボトルネックは外部APIだった
✓ 良い例:
1. 処理時間の内訳を計測
2. DB: 20ms, API: 150ms, App: 30ms と判明
3. API呼び出しの最適化に注力
計測の3原則
| 原則 | 説明 |
|---|---|
| 再現性 | 同じ条件で複数回計測し、ばらつきを確認 |
| 分離性 | 計測対象以外の要因を排除 |
| 本番近似 | 可能な 限り本番に近い環境で計測 |
計測ツール一覧
| 目的 | ツール | 用途 |
|---|---|---|
| 処理時間の内訳 | StopWatch | コード内の区間計測 |
| リクエスト全体の流れ | Jaeger / Zipkin | 分散トレーシング |
| DBクエリ分析 | EXPLAIN ANALYZE | 実行計画と実行時間 |
| 接続プール状況 | HikariCP Metrics | 接続数・待ち状況 |
| 負荷テスト | k6 | スループット・レイテンシ計測 |
処理時間の内訳を見る
StopWatch で区間計測
StopWatch sw = new StopWatch();
sw.start("DB取得");
User user = userRepository.findById(userId);
sw.stop();
sw.start("外部API");
Profile profile = externalApi.getProfile(userId);
sw.stop();
log.info(sw.prettyPrint());
出力例:
StopWatch '': running time = 156 ms
---------------------------------------------
ms % Task name
---------------------------------------------
023 15% DB取得
120 77% 外部API ← ボトルネック発見
013 08% レスポンス生成
見るべきポイント:
- どの区間が支配的か(%が大きいところ)
- 予想と実際の乖離