mcpField
P
performance-optimization

performance-optimization

github.com/pixel-process-ug開発380 回インストール33 週間前に更新
リポジトリ

performance-optimization について

アプリケーションの性能を診断・改善するための開発スキルです。測定、原因特定、最適化、検証のサイクルに沿って実際のボトルネックを調べ、測定可能な効果がある変更だけを残します。

主な機能

  1. 01変更前の性能ベースライン測定
  2. 02システム層ごとのボトルネック分析
  3. 03一度に一つの変更を適用
  4. 04再測定による効果検証
  5. 05キャッシュとバンドル最適化の指針
  6. 06データベース、Web Vitals、負荷テスト

活用シーン

  1. 01フロントエンド描画の遅延調査
  2. 02実行計画に基づくクエリ調整
  3. 03負荷時のAPI動作評価
  4. 04最適化による指標改善の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pixel-process-ug/superkit-agents --skill performance-optimization

インストール後、Claude Code で/performance-optimizationを入力して読み込まれたか確認します。

同梱ファイルperformance-budgets.md

詳細

パフォーマンス最適化

概要

測定に基づく方法論を使用して、パフォーマンスのボトルネックを体系的に特定し、解消します。このスキルでは、厳密な「測定・特定・最適化・検証」のサイクルを徹底し、時期尚早な最適化や憶測を防ぎます。すべての最適化で測定可能な改善が得られなければ、変更を元に戻します。

開始時に宣言:「パフォーマンス最適化スキルを使用して、ボトルネックを診断し、解消します。」


フェーズ 1:測定(ベースラインを確立する)

目標: 変更を加える前に、実際の指標を取得します。

アクション
# Web: Lighthouse CI
npx lighthouse https://your-app.com --output=json --output-path=baseline.json

# API: load test with k6
k6 run --out json=baseline.json loadtest.js

# Database: slow query log
# PostgreSQL: SET log_min_duration_statement = 100;  -- log queries > 100ms

これらの数値を記録します。改善を測定する際のベースラインになります。

停止 — 次の条件を満たすまでフェーズ 2 に進まないでください:
  • ベースライン指標を取得して保存している
  • 具体的な指標の目標を定義している(例:LCP < 2.5s)
  • 測定方法を文書化している(再実施できるように)

フェーズ 2:特定(実際のボトルネックを見つける)

目標: プロファイリングツールを使用して、時間がどこで費やされているかを特定します。推測してはいけません。

プロファイリングツールの選択表
レイヤーツール表示される内容
フロントエンドのレンダリングReact DevTools Profiler、Chrome Performance タブコンポーネントのレンダリング時間
ネットワークChrome Network タブ、WebPageTestリクエストのウォーターフォール、TTFB
JavaScriptChrome Performance タブ、console.time()関数の実行時間
Node.js サーバー--prof フラグ、clinic.js、0xCPU フレームグラフ
データベースEXPLAIN ANALYZE、pg_stat_statementsクエリプラン、遅いクエリ
メモリChrome Memory タブ、heapdumpメモリ割り当てのパターン、リーク
バンドルサイズwebpack-bundle-analyzer、vite-bundle-visualizerモジュールのサイズ

ボトルネックが想定した場所にあることは、ほとんどありません。まず測定してください。

停止 — 次の条件を満たすまでフェーズ 3 に進まないでください:
  • 対象レイヤーに適したプロファイリングツールを使用している
  • データに基づいて具体的なボトルネックを特定している
  • ボトルネックが問題の大きな部分を占めている

フェーズ 3:最適化(特定したボトルネックを修正する)

目標: 対象を絞った修正を適用します。一度に変更するのは 1 つだけです。

最適化の判断表
ボトルネックの種類最適化の方法例
大きなバンドルコード分割、ツリーシェイキング、動的インポートReact.lazy(() => import('./HeavyComponent'))
API レスポンスが遅いキャッシュ、クエリの最適化、ページネーションTTL 5min の Redis キャッシュを追加
データベースクエリが遅いインデックスの追加、クエリプランの最適化、マテリアライズドビューCREATE INDEX idx_user_email ON users(email)
再レンダリングが過剰メモ化、仮想化、状態の再構成React.memo、useMemo
画像が大きい圧縮、遅延読み込み、レスポンシブ画像<img loading="lazy" srcset="...">
TTFB が遅いサーバーサイドキャッシュ、CDN、エッジレンダリングStale-while-revalidate パターン
メモリリークイベントリスナーのクリーンアップ、弱参照を修正適切な useEffect のクリーンアップ
停止 — 次の条件を満たすまでフェーズ 4 に進まないでください:
  • 変更を 1 つだけ加えている
  • 変更が特定したボトルネックを直接対象としている
  • 最適化と併せて、無関係な変更を加えていない

フェーズ 4:検証(再度測定する)

目標: フェーズ 1 とまったく同じ測定を再実行します。

アクション
  1. フェーズ 1 と同じプロファイリング/測定を実行します
  2. 結果を比較します:
    • 指標は改善しましたか?
    • どのくらい改善しましたか?
    • ほかの指標が悪化しましたか?
  3. 改善を測定できない場合は、変更を元に戻します。

測定できない最適化は、最適化ではありません。

停止 — 次の条件を満たしたら検証完了です:
  • フェーズ 1 と同じ測定方法を使用している
  • 改善を定量化している(例:「LCP が 3.2s から 2.1s に短縮」)
  • ほかの指標に悪化がない
  • 改善がない場合:変更を元に戻している

キャッシュ戦略の判断表

キャッシュの種類使用する場面TTL の目安無効化
インメモリ(LRU)単一インスタンス、頻繁に使うデータ、計算済みの値数秒〜数分退避ポリシー
Redis/Memcached複数インスタンス、共有キャッシュ、セッション数分〜数時間イベントベースまたは TTL
CDN静的アセット、公開ページ、API レスポンス数時間〜数日デプロイをトリガーとしたパージ
ブラウザー再訪問、静的リソース数日〜数か月(バージョン管理)キャッシュ回避用ハッシュ
Cache-Control ヘッダー
# Immutable assets (hashed filenames)
Cache-Control: public, max-age=31536000, immutable

# API responses (cacheable but must revalidate)
Cache-Control: public, max-age=0, must-revalidate
ETag: "abc123"

# Private user data
Cache-Control: private, no-store

# Stale-while-revalidate (fast response + background refresh)
Cache-Control: public, max-age=60, stale-while-revalidate=300

バンドル最適化の手法

手法効果実装
ルート単位のコード分割高ルートごとに React.lazy() + Suspense
ツリーシェイキング高ES モジュールのみを使用し、sideEffects: false を指定
動的インポート中ユーザー操作時に await import('heavy-lib') を実行
画像の最適化高next/image、WebP/AVIF、レスポンシブな srcset
フォントの最適化中next/font、font-display: swap、サブセット
依存関係の置き換え中moment.js の代わりに day.js、lodash の代わりに lodash-es
バンドル分析コマンド
# Webpack
npx webpack-bundle-analyzer stats.json

# Vite
npx vite-bundle-visualizer

# Next.js
ANALYZE=true next build

データベースクエリのチューニング

インデックスの最適化
-- Find missing indexes (PostgreSQL)
SELECT schemaname, tablename, seq_scan, idx_scan
FROM pg_stat_user_tables
WHERE seq_scan > idx_scan
ORDER BY seq_scan DESC;
インデックスのルール
ルール説明
WHERE、JOIN、ORDER BY の列にインデックスを作成するDB が検索する列です
複合インデックスでは等価条件の列を先にする最も選択性の高い条件で先に絞り込みます
複合インデックスでは範囲条件の列を最後にする選択性が低く、等価条件の後に適用されます
使用されていないインデックスを削除する書き込みが遅くなります
フィルター付きクエリには部分インデックスを使用するインデックスが小さくなり、検索が速くなります
クエリプランで注意すべき点
EXPLAIN ANALYZE での注意点意味対処法
大きなテーブルでの Seq Scanテーブル全体のスキャンインデックスを追加する
行数の多い Nested LoopO(n*m) の結合インデックスを追加するか、クエリを再構成する
メモリー使用量の多い Sortメモリー内でのソートORDER BY に一致するインデックスを追加する
実際の行数が推定行数を大幅に上回る統計情報が古いANALYZE を実行する
ビルド対象が大きい Hash Joinメモリーを大量に使用する結合列にインデックスがあることを確認する

Web Vitals の目標値

指標良好要改善不良
LCP(最大コンテンツ描画)< 2.5s2.5-4s> 4s
INP(次の描画までの操作時間)< 200ms200-500ms> 500ms
CLS(累積レイアウトシフト)< 0.10.1-0.25> 0.25
Web Vitals の最適化表
指標最適化実装
LCPLCP リソースをプリロードする<link rel="preload"> または fetchpriority="high"
LCPクリティカル CSS をインライン化するファーストビューの CSS を抽出してインライン化する
LCPTTFB を最適化するCDN、エッジレンダリング、サーバーキャッシュ
INP長いタスクを分割するrequestIdleCallback、scheduler.yield()
INP入力ハンドラーをデバウンスする負荷の高いハンドラーに 100-300ms のデバウンスを適用する
INPWeb Workers計算処理をメインスレッドから移す
CLS寸法を明示する画像と動画に width/height を設定する
CLS動的コンテンツ用のスペースを確保する広告や埋め込みコンテンツのプレースホルダーのサイズを指定する
CLStransform アニメーションを使用するレイアウトを発生させるプロパティを避ける

負荷テスト

テストの種類
種類ユーザー数期間目的
スモーク1-21 分テストが機能することを確認する
負荷想定トラフィック10-30 分通常時のパフォーマンスを確認する
ストレス想定の 2-3 倍10-30 分限界点を見つける
ソーク通常負荷2-8 時間メモリーリークを見つける
主な指標
  • レスポンスタイムのパーセンタイル(p50、p95、p99)— 平均値ではありません
  • 負荷時のエラー率
  • スループット(リクエスト/秒)
  • リソース使用率(CPU、メモリー、接続数)

アンチパターン/よくある間違い

アンチパターン誤りである理由正しいアプローチ
計測せずに最適化する何を修正すべきか分かりませんまず必ず計測します
時期尚早な最適化ボトルネックではない箇所に時間を費やしますプロファイリングで実際のボトルネックを特定します
すべてをメモ化する効果が確認されていないまま複雑さが増しますまずプロファイリングし、その後にメモ化します
無効化戦略なしでキャッシュする古いデータがバグの原因になりますキャッシュを追加する前に無効化の方法を定義します
パーセンタイルではなく平均値を最適化する平均値ではテールレイテンシが見えませんp95 と p99 を追跡します
複数の最適化を同時に行う改善の要因を特定できません一度に1つだけ変更します
効果を計測できない最適化を残す不要なコードと複雑さが残ります計測可能な改善がなければ元に戻します
クエリのパターンを確認せずにインデックスを追加する使われないインデックスは書き込みを遅くしますまずスロークエリログを確認します

サブエージェントへの委任機会

タスクのパターン委任先実施するタイミング
異なるシステムレイヤーを並行してプロファイリングするsubagent_type="Explore" を指定した Agent ツール(レイヤーごとに1つ)フロントエンド、バックエンド、データベースを個別に分析するとき
バンドル分析とツリーシェイキングのレビューsubagent_type="general-purpose" を指定した Agent ツールフロントエンドのバンドルサイズが懸念されるとき
データベースクエリの最適化分析database-architect エージェントに処理を委任する Agent ツール複数のテーブルにわたって遅いクエリが特定されたとき

委任する際は、dispatching-parallel-agents スキルのプロトコルに従ってください。


統合ポイント

スキル関連性
senior-frontendフロントエンドのパフォーマンスでは、バンドルと Web Vitals の最適化を使用します
senior-backendバックエンドのパフォーマンスでは、キャッシュとクエリのチューニングを使用します
testing-strategy負荷テストはテストピラミッドの一部です
code-reviewレビューではパフォーマンスの低下を確認します
systematic-debuggingパフォーマンスの問題にも同じ調査方法を適用します
acceptance-testingパフォーマンスの目標を受け入れ基準にします

スキルの種類

柔軟 — プロジェクトの状況に応じて最適化の深さを調整します。すべての最適化で、計測・特定・最適化・検証のサイクルを必ず実施してください。計測可能な改善につながらない変更は、元に戻してください。

コメント