performance-profiling について
Apple アプリのパフォーマンスを、対象を絞った計測で診断・改善するスキルです。ハング、メモリ増加、起動遅延、電力消費、ネットワークの無駄に応じた分析手順を開発者に示します。
主な機能
- 01問題別のプロファイラー選択ガイド
- 02CPU、メモリ、起動、電力の資料
- 03実機と Release ビルドでの計測指針
- 04修正前後の測定手順
- 05Xcode 診断と MetricKit の活用案内
活用シーン
- 01UI のハングや高 CPU 使用率の調査
- 02メモリリークや増加の分析
- 03アプリ起動の遅さの測定
- 04バッテリー、熱、通信コストの評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mengto/ skills --skill performance-profilingインストール後、Claude Code で/performance-profilingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamldemo/expected-output.mdindex.htmlinput.mdPROMPT.mdreferences/energy-diagnostics.mdlaunch-optimization.mdmemory-profiling.mdtime-profiler.md詳細
パフォーマンスのプロファイリング
このスキルを使用すると、Apple アプリのパフォーマンス問題を体系的に診断し、適切なプロファイリングワークフローを選び、的を絞った修正を適用して、実測値で変更を検証できます。
判断ツリー
コードを変更する前に、参照ファイルを選択してください。
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 |
| ネットワークの無駄 | Network profiler | 重複したフェッチ、ペイロードサイズ | references/energy-diagnostics.md |
ワークフロー
- ユーザーの報告、トレース、ログ、またはコードパスからパフォーマンスのカテゴリを特定します。
- 問題が広範囲に及ぶか不明瞭でない限り、該当する参照ファイルのみを読みます。
- 実際のデータを使用し、Release ビルドで実機プロファイリングすることを優先します。
- 修正を提案する前に、プロファイルで示されたコードパスを調べます。
- 測定されたボトルネックに対処する、最小限で的を絞った修正を適用します。
- 再度プロファイリングするか、再現可能な測定を追加して改善を確認します。
プロファイリングの基本ルール
- 可能な場合は実機でプロファイリングします。Simulator はホストの CPU とメモリを使用します。
- 最適化によってホットパスが変わる可能性があるため、Release 構成を使用します。
- 空のデータベースや簡易的なアセットではなく、実際の使用状況を代表するデータで再現します。
- プロファイリング中のノイズを減らすため、関係のないアプリを終了します。
- 結果を明確にするため、修正前後の測定値を記録します。
- ワークフローの継続的な時間計測が必要な場合は、
os_signpostマーカーを追加します。
Xcode の診断
疑われる問題に該当する場合は、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 を超える同期処理がないこと。
- メインスレッドでファイル I/O やネットワーク呼び出しを行わないこと。
- 大規模な Core Data または SwiftData のフェッチには、バックグラウンドコンテキストを使用すること。
- 画像はメインスレッド以外でデコードすること。
@MainActorは、UI へのアクセスが本当に必要なコードに限定すること。
メモリ:
- デリゲート、クロージャー、オブザーバー、非同期タスクに保持サイクルがないこと。
- 大きなリソースは表示されなくなった時点で解放すること。
- コレクションとキャッシュのサイズに上限を設けること。
- Objective-C オブジェクトを生成するタイトなループでは、
autoreleasepoolを使用すること。
起動:
@main App構造体のinit()で重い処理を行わないこと。- 必須ではない初期化は遅延すること。
- 実用上可能な範囲で動的フレームワークを最小限にすること。
- 起動中に同期ネットワーク呼び出しを行わないこと。
エネルギー:
- バックグラウンドタスクでは、適切な
BGTaskSchedulerリクエストタイプを使用すること。 - 位置情報の精度は、製品の要件に合わせること。
- システムが起動をまとめられるよう、タイマーに許容範囲を設定すること。
- 可能な場合はネットワークリクエストをまとめて送信し、キャッシュすること。
参考資料
references/time-profiler.md:CPU プロファイリング、ハング検出、サインポスト API。references/memory-profiling.md:Allocations、Leaks、メモリーグラフデバッガー。references/launch-optimization.md:起動フェーズとコールド/ウォームスタートの最適化。references/energy-diagnostics.md:バッテリー、熱状態、ネットワーク効率。
コメント
Markdown 対応