mcpField
P
performance-profiling

performance-profiling

github.com/akillness開発5358 回インストール今日更新
リポジトリ

performance-profiling について

Apple プラットフォームアプリのパフォーマンス問題を診断・対処するスキルです。症状に応じた Xcode の計測ツールと手順を示し、実測値で修正を検証する方法も案内します。

主な機能

  1. 01症状に応じたプロファイリング資料の選択
  2. 02CPU、メモリ、起動、電力の問題を分析
  3. 03Xcode Diagnostics のチェック項目を適用
  4. 04代表的な条件で修正後に再計測

活用シーン

  1. 01アプリの停止、カクつき、CPU 高負荷を調査
  2. 02メモリリークやメモリ使用量の増加を特定
  3. 03起動の遅さ、電池消費、熱問題を分析

インストール

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

$npx skills add https://github.com/akillness/jeo-skills --skill performance-profiling

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

SKILL.toon
agents/
openai.yaml
references/
energy-diagnostics.md
time-profiler.md
memory-profiling.md
launch-optimization.md

詳細

パフォーマンスのプロファイリング

このスキルを使って、Apple アプリのパフォーマンス問題を体系的に診断し、適切なプロファイリングのワークフローを選択し、対象を絞った修正を適用して、実測値で変更を検証します。

このスキルを使う場面

  • Time Profiler によるプロファイリングが必要な、Apple プラットフォームアプリのハング、カクつき、フレーム落ち、高い CPU 使用率
  • Leaks、Allocations、またはメモリグラフデバッガーによる調査が必要な、メモリリーク、メモリ使用量の制御不能な増加、OOM クラッシュ
  • App Launch インストゥルメントによる分析が必要な、コールド起動/ウォーム起動の遅さ、初回フレーム表示までの時間の遅さ
  • Energy Log による調査が必要な、バッテリー消費、サーマルスロットリング、過剰なバックグラウンド/ネットワークの電力消費
  • Xcode Diagnostics と MetricKit の包括的なレビュー用チェックリストや、os_signpost による計測フックの追加が必要な、リリース前のパフォーマンス監査
  • バンドルサイズ、API レイテンシ、データベースのクエリプランなど、一般的な(Apple 以外の)Web/サービスのパフォーマンス調整には使用しません。その場合は performance-optimization を使用してください。また、Unity/Unreal Engine のフレームキャプチャの解釈には使用しません。その場合は game-performance-profiler を使用してください。

判断ツリー

コードを変更する前に、参照ファイルを選択してください。

What performance problem are you investigating?

+ App hangs, stutters, dropped frames, slow UI, high CPU
  -> Read references/time-profiler.md

+ High memory, leaks, OOM crashes, growing footprint
  -> Read references/memory-profiling.md

+ Slow cold launch, warm launch, resume, or time to first frame
  -> Read references/launch-optimization.md

+ Battery drain, thermal throttling, background energy, network waste
  -> Read references/energy-diagnostics.md

+ General "app feels slow"
  -> Start with references/time-profiler.md, then references/memory-profiling.md

+ Pre-release performance audit
  -> Read all reference files and use the review checklist below

クイックリファレンス

問題インストゥルメント/ツール主な指標参照先
UI が 250 ms を超えてハングするTime Profiler + Hangsハング時間、メインスレッドのスタックreferences/time-profiler.md
高い CPU 使用率Time Profiler関数ごとの CPU 使用率、コールツリーの重みreferences/time-profiler.md
メモリリークLeaks + Memory Graphリークしたバイト数、保持サイクルの経路references/memory-profiling.md
メモリ使用量の増加Allocations生存バイト数、世代分析references/memory-profiling.md
起動が遅いApp Launch初回フレームまでの時間、メイン処理前、メイン処理後references/launch-optimization.md
バッテリー消費Energy Logエネルギーへの影響、CPU/GPU/ネットワークのアクティビティreferences/energy-diagnostics.md
サーマル問題Activity Monitor、Instrumentsサーマル状態の遷移references/energy-diagnostics.md
ネットワークの無駄ネットワークプロファイラー重複した取得、ペイロードサイズreferences/energy-diagnostics.md

ワークフロー

  1. ユーザーからの報告、トレース、ログ、またはコードパスからパフォーマンスのカテゴリを特定します。
  2. 問題が広範または不明確でない限り、該当する参照ファイルだけを読みます。
  3. 代表的なデータを使い、Release ビルドで実機のプロファイリングを優先します。
  4. 修正を提案する前に、プロファイルで示されたコードパスを調査します。
  5. 実測されたボトルネックに対処する、最小限で対象を絞った修正を適用します。
  6. 再度プロファイリングするか、再現可能な計測を追加して、改善を確認します。

プロファイリングの基本ルール

  • 可能な場合は実機でプロファイリングします。Simulator はホストの CPU とメモリを使用します。
  • 最適化によってホットパスが変わる場合があるため、Release 構成を使用します。
  • 空のデータベースや簡易的なアセットではなく、代表的なデータを使って再現します。
  • プロファイリング中のノイズを減らすため、関係のないアプリを終了します。
  • 結果を具体的に示せるよう、修正前後の計測値を残します。
  • 継続的に処理時間を把握する必要があるワークフローでは、os_signpost マーカーを追加します。

Xcode Diagnostics

疑われる問題に合致する場合は、Scheme > Run > Diagnostics の関連設定を推奨します。

設定用途
Main Thread Checkerメインスレッド以外での UI 処理
Thread Sanitizerデータ競合、安全でない共有状態
Address Sanitizerバッファーオーバーフロー、解放後使用
Malloc Stack Loggingメモリ割り当てのコールスタック
Zombie Objects解放済みオブジェクトへのメッセージ

MetricKit フック

起動、応答性、メモリ、診断情報を本番環境で監視するために、MetricKit を提案してください。

import MetricKit

final class PerformanceReporter: NSObject, MXMetricManagerSubscriber {
    func startCollecting() {
        MXMetricManager.shared.add(self)
    }

    func didReceive(_ payloads: [MXMetricPayload]) {
        for payload in payloads {
            if let launch = payload.applicationLaunchMetrics {
                log("Resume time: \(launch.histogrammedResumeTime)")
            }
            if let responsiveness = payload.applicationResponsivenessMetrics {
                log("Hang time: \(responsiveness.histogrammedApplicationHangTime)")
            }
            if let memory = payload.memoryMetrics {
                log("Peak memory: \(memory.peakMemoryUsage)")
            }
        }
    }

    func didReceive(_ payloads: [MXDiagnosticPayload]) {
        for payload in payloads {
            if let hangs = payload.hangDiagnostics {
                for hang in hangs {
                    log("Hang: \(hang.callStackTree)")
                }
            }
        }
    }
}

レビューチェックリスト

応答性:

  • メインスレッドで100 msを超える同期処理を行わないでください。
  • メインスレッドでファイルの入出力やネットワーク呼び出しを行わないでください。
  • Core DataまたはSwiftDataの大規模なフェッチには、バックグラウンドコンテキストを使用してください。
  • 画像はメインスレッド以外でデコードしてください。
  • @MainActorは、UIへのアクセスが本当に必要なコードに限定してください。

メモリ:

  • デリゲート、クロージャー、オブザーバー、非同期タスクで保持サイクルを発生させないでください。
  • 大きなリソースは、表示されなくなったら解放してください。
  • コレクションとキャッシュのサイズに上限を設けてください。
  • Objective-Cオブジェクトを生成するタイトなループでは、autoreleasepoolを使用してください。

起動:

  • @main App構造体のinit()で重い処理を行わないでください。
  • 必須ではない初期化は遅延させてください。
  • 実用上可能な範囲で、ダイナミックフレームワークを最小限にしてください。
  • 起動時に同期ネットワーク呼び出しを行わないでください。

エネルギー:

  • バックグラウンドタスクには、適切なBGTaskSchedulerリクエストタイプを使用してください。
  • 位置情報の精度は、製品のニーズに合わせてください。
  • タイマーには許容範囲を設定し、システムがウェイクアップをまとめられるようにしてください。
  • 可能な場合は、ネットワークリクエストをまとめてキャッシュしてください。

参考資料

  • 上流ソース:MengTo/Skills — performance-profiling
  • references/time-profiler.md:CPUプロファイリング、ハング検出、signpost API。
  • references/memory-profiling.md:Allocations、Leaks、Memory Graphデバッガー。
  • references/launch-optimization.md:起動フェーズとコールド/ウォームスタートの最適化。
  • references/energy-diagnostics.md:バッテリー、熱状態、ネットワーク効率。
  • agents/openai.yaml:OpenAIエージェントのインターフェースメタデータ(表示名、短い説明、デフォルトのプロンプト)。

コメント