4.3 Performance・Memory
Performance Panel & Memory Panel
リンク
Performanceパネル
ページのパフォーマンスを詳細に分析するツール。CPU使用率、レンダリング、スクリプト実行時間などを可視化する。
記録の開始
| 操作 | 方法 |
|---|---|
| 記録開始 | ●ボタンまたはCtrl+E |
| 記録停止 | 同上または「Stop」ボタン |
| リロード記録 | ⟳ボタンでページ読み込みを記録 |
記録前の設定
- CPU throttling: CPUを低速化してモバイル環境をシミュレート
- Network throttling: 低速回線をシミュレート
- Disable JavaScript samples: 詳細なJSプロファイルを無効化(軽量化)
- Screenshots: 記録中のスクリーンショットを取得
パフォーマンス分析
タイムライン構成
| セクション | 内容 |
|---|---|
| Overview | FPS、CPU、NETの概要グラフ |
| Network | リソース読み込みのタイムライン |
| Frames | 各フレームのスクリーンショット |
| Timings | DOMContentLoaded、FCP、LCPなど |
| Main | メインスレッドのアクティビティ |
| Compositor | コンポジットスレッド |
| GPU | GPU処理 |
Mainセクションの色分け
| 色 | 内容 |
|---|---|
| 黄色 | Scripting(JavaScript実行) |
| 紫 | Rendering(レイアウト計算) |
| 緑 | Painting(描画) |
| グレー | System / Idle |
主要メトリクス
| メトリクス | 説明 | 目標値 |
|---|---|---|
| FCP | First Contentful Paint - 最初のコンテンツ描画 | < 1.8秒 |
| LCP | Largest Contentful Paint - 最大コンテンツ描画 | < 2.5秒 |
| TBT | Total Blocking Time - メインスレッドブロック時間 | < 200ms |
| CLS | Cumulative Layout Shift - レイアウトシフト累積 | < 0.1 |
| TTI | Time to Interactive - インタラクティブになるまでの時間 | < 3.8秒 |
Core Web Vitals
Googleが提唱するUX指標。LCP、FID(First Input Delay)、CLSの3つが重要。これらはSEOにも影響する。
パフォーマンス改善のヒント
ボトルネックの特定
- 黄色(Script)が多い → JavaScript最適化が必要
- 紫(Rendering)が多い → レイアウトスラッシングの可能性
- 緑(Paint)が多い → 描画領域の最適化
- Long Taskがある → 50ms以上のタスクを分割
便利な機能
- Bottom-Up / Call Tree: 関数ごとの実行時間
- Event Log: イベントの時系列リスト
- Record時のCPU制限: 6x slowdownでモバイルをシミュレート
Memoryパネル
JavaScriptのメモリ使用状況を分析するツール。メモリリークの検出に有効。
プロファイリングの種類
| 種類 | 用途 |
|---|---|
| Heap snapshot | その時点のメモリ状態をスナップショット |
| Allocation instrumentation | 時間経過でのメモリ割り当てを記録 |
| Allocation sampling | サンプリングベースの軽量プロファイル |
Heap Snapshot
メモリ上のオブジェクトを詳細に分析できる。
ビューの種類
| ビュー | 説明 |
|---|---|
| Summary | コンストラクタ別にグループ化 |
| Comparison | 2つのスナップショットを比較 |
| Containment | オブジェクトの包含関係 |
| Statistics | メモリ使用の統計 |
主要なカラム
- Shallow Size: オブジェクト自体のサイズ
- Retained Size: オブジェクトとその参照先を含む総サイズ
- Distance: GCルートからの距離
メモリリークの検出
検出手順
- Heap snapshotを取得(操作前)
- メモリリークが疑われる操作を実行
- 「Collect garbage」ボタンでGCを強制実行
- Heap snapshotを再取得(操作後)
- Comparisonビューで差分を確認
よくあるメモリリークの原因
- イベントリスナーの未解除: removeEventListenerの忘れ
- タイマーの未クリア: setInterval/setTimeoutの未clear
- DOM参照の保持: 削除された要素への参照を保持
- クロージャ: 不要な変数をキャプチャ
- グローバル変数: 意図しないグローバル変数の作成
拡張機能でのメモリリーク
Content Scriptで要素にイベントリスナーを追加した場合、ページ遷移時に自動的にクリーンアップされるが、Service Workerでの長時間動作するリスナーは注意が必要。
修正例
// NG: イベントリスナーが解除されない
element.addEventListener('click', handler);
// OK: 解除可能にする
const controller = new AbortController();
element.addEventListener('click', handler, { signal: controller.signal });
// 解除時
controller.abort();
Allocation Timeline
時間経過でのメモリ割り当てを可視化する。
- 青いバー: その時点で割り当てられたオブジェクト
- グレーのバー: GCで回収されたオブジェクト
- 残っている青いバー: 潜在的なメモリリーク
分析のコツ
- 特定の操作の前後で記録を開始・停止
- 残存するオブジェクトのRetainerを確認
- なぜGCされないかの参照チェーンを追跡
参考文献
[1] Chrome DevTools - Analyze runtime performance
[2] Chrome DevTools - Fix memory problems
[1] Chrome DevTools - Analyze runtime performance
[2] Chrome DevTools - Fix memory problems