performance-profiling について
Apple プラットフォームアプリのパフォーマンス問題を診断・対処するスキルです。症状に応じた Xcode の計測ツールと手順を示し、実測値で修正を検証する方法も案内します。
主な機能
- 01症状に応じたプロファイリング資料の選択
- 02CPU、メモリ、起動、電力の問題を分析
- 03Xcode Diagnostics のチェック項目を適用
- 04代表的な条件で修正後に再計測
活用シーン
- 01アプリの停止、カクつき、CPU 高負荷を調査
- 02メモリリークやメモリ使用量の増加を特定
- 03起動の遅さ、電池消費、熱問題を分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ akillness/ jeo-skills --skill performance-profilingインストール後、Claude Code で/performance-profilingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
SKILL.toonagents/openai.yamlreferences/energy-diagnostics.mdtime-profiler.mdmemory-profiling.mdlaunch-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 |
ワークフロー
- ユーザーからの報告、トレース、ログ、またはコードパスからパフォーマンスのカテゴリを特定します。
- 問題が広範または不明確でない限り、該当する参照ファイルだけを読みます。
- 代表的なデータを使い、Release ビルドで実機のプロファイリングを優先します。
- 修正を提案する前に、プロファイルで示されたコードパスを調査します。
- 実測されたボトルネックに対処する、最小限で対象を絞った修正を適用します。
- 再度プロファイリングするか、再現可能な計測を追加して、改善を確認します。
プロファイリングの基本ルール
- 可能な場合は実機でプロファイリングします。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エージェントのインターフェースメタデータ(表示名、短い説明、デフォルトのプロンプト)。
コメント
Markdown 対応