axiom-ios-performance について
iOS 開発者向けのパフォーマンス問題ルーティングスキルです。メモリ、応答性、電力、タイマーなどの症状に応じて、調査に適したスキルやエージェントへ案内します。
主な機能
- 01症状別の専門スキルへの案内
- 02メモリ、ハング、電力問題の切り分け
- 03GUI とコマンドラインの分析経路
- 04自動監査とプロファイリング依頼の案内
活用シーン
- 01アプリが遅いときの調査開始点の選定
- 02メモリ増加やリークの調査
- 03アプリのフリーズやバッテリー消費の診断
- 04Instruments と xctrace の選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-ios-performanceインストール後、Claude Code で/axiom-ios-performanceを入力して読み込まれたか確認します。
詳細
iOS パフォーマンスルーター
メモリリーク、実行速度の低下、バッテリー消費、プロファイリングなど、パフォーマンスに関する問題には必ずこのスキルを使用してください。
使用するタイミング
以下の場合にこのルーターを使用します:
- アプリの動作が遅い、または重く感じる
- メモリ使用量が時間の経過とともに増加する
- バッテリーの消耗が早い
- 使用中にデバイスが熱くなる
- バッテリー設定でエネルギー使用量が多い
- Instruments でパフォーマンスを診断する
- メモリリークや保持サイクルがある
- メモリ警告によってアプリがクラッシュする
振り分けのロジック
メモリの問題
メモリリーク(Swift) → /skill axiom-memory-debugging
- リークを体系的に診断します
- よくあるリークパターンを5つ紹介します
- Instruments のワークフローを説明します
deinitが呼び出されない問題を扱います
メモリリークのスキャン → memory-auditor エージェントを起動するか、/axiom:audit memory を使用します(5段階のセマンティック監査:リソースの所有関係をマッピングし、6つのリークパターンを検出し、クリーンアップ漏れを推論し、複合リスクを関連付け、ライフサイクルの健全性をスコア化します)
メモリリーク(Objective-C のブロック) → /skill axiom-objc-block-retain-cycles
- ブロックの保持サイクル
- 弱参照から強参照へのパターン
- ネットワークコールバックのリーク
パフォーマンスのプロファイリング
パフォーマンスのプロファイリング(GUI) → /skill axiom-performance-profiling
- Time Profiler(CPU)
- Allocations(メモリの増加)
- Core Data のプロファイリング(N+1 クエリ)
- ツール選択のための判断ツリー
自動プロファイリング(CLI) → /skill axiom-xctrace-ref
- ヘッドレス環境での xctrace プロファイリング
- CI/CD への統合パターン
- コマンドラインでのトレース記録
- プログラムによるトレース分析
自動プロファイルの実行 → performance-profiler エージェントを使用するか、/axiom:profile を実行します
- xctrace でトレースを記録します
- データをエクスポートして分析します
- 重要度とともに調査結果を報告します
ハング/フリーズの問題
アプリがハングまたはフリーズする → /skill axiom-hang-diagnostics
- UI が1秒を超えて応答しない
- メインスレッドがブロックされている(ビジー状態または待機中)
- ビジー状態とブロック状態を診断する判断ツリー
- Time Profiler と System Trace の選択
- よくあるハングパターン8つと対処法
- ウォッチドッグによる終了
エネルギーの問題
バッテリー消費、高いエネルギー使用量 → /skill axiom-energy
- Power Profiler のワークフロー
- サブシステムの診断(CPU/GPU/ネットワーク/位置情報/ディスプレイ)
- アンチパターンの修正
- バックグラウンド実行の最適化
症状に基づく診断 → /skill axiom-energy-diag
- 「バッテリー設定でアプリが最上位に表示される」
- 「デバイスが熱くなる」
- 「バックグラウンドでバッテリーを消耗する」
- 各診断経路の所要時間分析
コード付き API リファレンス → /skill axiom-energy-ref
- WWDC のコード例を網羅
- タイマー、ネットワーク、位置情報の効率化
- BGContinuedProcessingTask(iOS 26)
- MetricKit のセットアップ
エネルギーのスキャン → energy-auditor エージェントを起動するか、/axiom:audit energy を使用します(8つのアンチパターン:タイマーの濫用、ポーリング、位置情報の継続取得、アニメーションのリーク、バックグラウンドモードの誤用、ネットワークの非効率、GPU の浪費、ディスク I/O)
タイマーの安全性
タイマーのクラッシュパターン(DispatchSourceTimer) → /skill axiom-timer-patterns
- EXC_BAD_INSTRUCTION を引き起こすクラッシュシナリオを4つ紹介します
- RunLoop モードの注意点(スクロール中に Timer が停止する)
- SafeDispatchTimer ラッパー
- Timer と DispatchSourceTimer の選び方
タイマー API リファレンス → /skill axiom-timer-patterns-ref
- Timer、DispatchSourceTimer、Combine、AsyncTimerSequence の API
- ライフサイクル図
- プラットフォームの対応状況
Swift のパフォーマンス
Swift のパフォーマンス最適化 → /skill axiom-swift-performance
- 値型と参照型、コピーオンライト
- ARC のオーバーヘッド、ジェネリックの特殊化
- コレクションのパフォーマンス
Swift パフォーマンスのスキャン → swift-performance-analyzer エージェントを起動するか、/axiom:audit swift-performance を使用します(不要なコピー、ARC のオーバーヘッド、特殊化されていないジェネリクス、コレクションの非効率性、アクター分離のコスト、メモリレイアウト)
モダンな Swift のイディオム → /skill axiom-swift-modern
- 古い API のパターン(Date()、CGFloat、DateFormatter)
- Foundation のモダナイゼーション(URL.documentsDirectory、FormatStyle)
- Claude 固有の幻覚の修正
MetricKit の統合
MetricKit API リファレンス → /skill axiom-metrickit-ref
- MXMetricPayload の解析
- MXDiagnosticPayload(クラッシュ、ハング)
- フィールドパフォーマンスデータの収集
- クラッシュレポートとの統合
実行時コンソールのキャプチャ
シミュレーターのコンソール出力をキャプチャ → /skill axiom-xclog-ref or /axiom:console
- シミュレーターから print()、os_log()、Logger の出力をキャプチャ
- レベル、サブシステム、カテゴリを含む構造化 JSON
--timeoutと--max-linesによる上限付きの収集- サブシステムまたは正規表現でフィルタリング
実行時状態の調査
LLDB による対話型デバッグ → /skill axiom-lldb
- ブレークポイントの設定、実行時の変数の調査
- クラッシュログからのクラッシュ再現
- ハング時のスレッド状態の分析
- Swift の値の調査(po または v)
LLDB コマンドリファレンス → /skill axiom-lldb-ref
- コマンド構文の完全な説明
- ブレークポイントのレシピ
- 式の評価パターン
判断ツリー
- メモリが増加し、UI がカクつく/ジャンクする場合は? → まず memory-debugging(メモリプレッシャーによって GC の一時停止が発生し、フレームが落ちるため)、メモリを改善してもカクつきが残る場合は performance-profiling
- メモリリーク(Swift)の場合は? → memory-debugging
- メモリリーク(Objective-C ブロック)の場合は? → objc-block-retain-cycles
- アプリがハング/フリーズする場合、UI が完全に応答しませんか(タップできず、反応もない)?
- はい → hang-diagnostics(ビジー状態かブロック状態かを診断)
- いいえ、単に遅いだけ → performance-profiling(Time Profiler)
- 初回起動時だけですか? → hang-diagnostics で同期 I/O または遅延初期化も確認
- 複数の非同期処理が同時に完了すると遅くなる場合は? →
axiom-ios-concurrencyに誘導(プロファイリングではなく、コールバックの競合) - バッテリー消費(症状がわかっている)の場合は? → energy-diag
- バッテリー消費(API リファレンスが必要)の場合は? → energy-ref
- バッテリー消費(一般)の場合は? → energy
- MetricKit の設定/解析の場合は? → metrickit-ref
- GUI(Instruments)でプロファイリングする場合は? → performance-profiling
- CLI(xctrace)でプロファイリングする場合は? → xctrace-ref
- 今すぐ自動プロファイリングを実行する場合は? → performance-profiler エージェント
- 全般的に遅い/ラグがある場合は? → performance-profiling
- 先回りしてメモリリークをスキャンする場合は? → memory-auditor(Agent)
- エネルギー関連のアンチパターンをスキャンする場合は? → energy-auditor(Agent)
- Swift のパフォーマンス監査(ARC、ジェネリクス、コレクション)が必要な場合は? → swift-performance-analyzer(Agent)
- 実行時の変数/スレッド状態を調査する必要がある場合は? → axiom-lldb
- LLDB コマンドの正確な構文が必要な場合は? → axiom-lldb-ref
- スクロール中にタイマーが停止する場合は? → timer-patterns(RunLoop モード)
- DispatchSourceTimer で EXC_BAD_INSTRUCTION クラッシュが発生する場合は? → timer-patterns(4 つのクラッシュパターン)
- Timer、DispatchSourceTimer、Combine タイマー、async タイマーのどれを選ぶか迷う場合は? → timer-patterns
- タイマー API の構文/ライフサイクルが必要な場合は? → timer-patterns-ref
- 古い Swift パターンのコードレビューが必要な場合は? → swift-modern
- Claude がレガシー API(DateFormatter、CGFloat、DispatchQueue)を生成する場合は? → swift-modern
- プロファイリング前に実行時のコンソール出力を確認する必要がある場合は? → xclog-ref or
/axiom:console
合理化への対処
| 考え | 実際には |
|---|---|
| 「メモリリークだと分かっているから、探してみよう」 | メモリリークには6つのパターンがあります。memory-debugging を使えば、正しいパターンを15分で診断できます。通常は2時間かかります。 |
| 「Time Profiler を実行すればいい」 | Instruments のテンプレートを間違えると、時間を無駄にします。performance-profiling は最初に適切なツールを選びます。 |
| 「バッテリー消費の原因はたぶんネットワーク層だ」 | エネルギー関連の問題は8つのサブシステムにまたがります。energy スキルを使えば、実際の原因を診断できます。 |
| 「アプリの動作が遅く感じるけれど、最適化は後でやろう」 | パフォーマンスの問題は積み重なります。今プロファイリングすれば、後で何倍もの時間を節約できます。 |
| 「単なるUIのフリーズだろう。おそらくAPI呼び出しが遅い」 | フリーズの原因には、ビジー状態とブロック状態があります。hang-diagnostics には、どちらにも対応する判断ツリーがあります。 |
| 「メモリ使用量が増えて、スクロールもカクつく。別々のバグが2つあるんだ」 | メモリプレッシャーによってGCの一時停止が発生し、フレームが落ちます。まずリークを修正してから、スクロールのパフォーマンスを再確認してください。 |
| 「初回起動時だけフリーズする。何かを読み込んでいるに違いない」 | 初回起動時のハングには、同期I/O、遅延初期化、メインスレッドの競合という3つのパターンがあります。hang-diagnostics でどれに該当するか診断できます。 |
| 「ネットワークリクエストの完了時にUIがロックする。遅いだけだろう」 | 複数のコールバックが同時に完了する=メインスレッドの競合=並行処理の問題です。ios-concurrency に案内します。 |
| 「デバッグ用に print 文を追加すればいい」 | print によるデバッグのサイクルは1回あたり3〜5分かかります(ビルド+実行+再現)。LLDBのブレークポイントなら30秒です。axiom-lldb にコマンドがあります。 |
| 「アプリのログが見えない」 | xclog はシミュレーターから print() と os_log を取得し、構造化JSONとして出力します。/axiom:console または /skill axiom-xclog-ref を使ってください。 |
| 「Timer.scheduledTimer を使えばいい。そちらのほうが簡単だ」 | スクロール中、Timer は停止します(.default モード)。また、ターゲットを保持するためリークします。timer-patterns には判断ツリーがあります。 |
| 「DispatchSourceTimer がクラッシュしたけれど、たまにしか起きない。リリースしよう」 | DispatchSourceTimer のクラッシュパターンは4つあり、いずれも必ず再現します。timer-patterns でどのパターンか診断できます。 |
| 「Claude は最新の Swift をすでに知っている」 | Claude は Date()、CGFloat、filter().count など、Swift 5.5より前のパターンをデフォルトで使います。swift-modern に修正用の一覧があります。 |
重要なパターン
メモリデバッグ(memory-debugging):
- 6つのリークパターン:タイマー、オブザーバー、クロージャー、デリゲート、ビューのコールバック、PhotoKit
- Instruments のワークフロー
- リークとキャッシュの違い
パフォーマンスプロファイリング(performance-profiling):
- CPUのボトルネックには Time Profiler
- メモリ使用量の増加には Allocations
- N+1クエリには Core Data SQL ロギング
- セルフタイムと合計時間
エネルギー最適化(energy):
- Power Profiler によるサブシステムの診断
- 8つのアンチパターン:タイマー、ポーリング、位置情報、アニメーション、バックグラウンド処理、ネットワーク、GPU、ディスク
- サブシステム別の監査チェックリスト
- 期限に左右されないための負荷シナリオ
呼び出し例
ユーザー:「アプリのメモリ使用量が増え続けています」
→ 呼び出し:/skill axiom-memory-debugging
ユーザー:「メモリリークがありますが、deinit が呼び出されません」
→ 呼び出し:/skill axiom-memory-debugging
ユーザー:「アプリの動作が遅いようです。どこから始めればよいですか?」
→ 呼び出し:/skill axiom-performance-profiling
ユーザー:「Objective-C のブロックコールバックでリークが発生しています」
→ 呼び出し:/skill axiom-objc-block-retain-cycles
ユーザー:「アプリのバッテリー消費が激しいです」
→ 呼び出し:/skill axiom-energy
ユーザー:「アプリを使うとデバイスが熱くなるとユーザーから言われます」
→ 呼び出し:/skill axiom-energy-diag
ユーザー:「効率的な位置情報追跡を実装する最善の方法は何ですか?」
→ 呼び出し:/skill axiom-energy-ref
ユーザー:「アプリの CPU 使用率をプロファイルしてください」
→ performance-profiler エージェントを使用(または /axiom:profile)
ユーザー:「コマンドラインから xctrace を実行するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-xctrace-ref
ユーザー:「CI/CD 向けにヘッドレスプロファイリングが必要です」
→ 呼び出し:/skill axiom-xctrace-ref
ユーザー:「アプリがときどきハングします」
→ 呼び出し:/skill axiom-hang-diagnostics
ユーザー:「UI がフリーズして応答しなくなります」
→ 呼び出し:/skill axiom-hang-diagnostics
ユーザー:「メインスレッドがブロックされています。診断するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-hang-diagnostics
ユーザー:「MetricKit を設定するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-metrickit-ref
ユーザー:「MXMetricPayload を解析するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-metrickit-ref
ユーザー:「コードをスキャンしてメモリリークを見つけてください」
→ memory-auditor エージェントを呼び出し
ユーザー:「アプリのバッテリー消費の問題をチェックしてください」
→ energy-auditor エージェントを呼び出し
ユーザー:「Swift コードにパフォーマンス上のアンチパターンがないか監査してください」
→ swift-performance-analyzer エージェントを呼び出し
ユーザー:「デバッガーでこの変数を調べるにはどうすればよいですか?」
→ 呼び出し:/skill axiom-lldb
ユーザー:「条件付きブレークポイントを設定する LLDB コマンドは何ですか?」
→ 呼び出し:/skill axiom-lldb-ref
ユーザー:「デバッガーでこのクラッシュを再現する必要があります」
→ 呼び出し:/skill axiom-lldb
ユーザー:「リストのスクロールが遅く、メモリ使用量も増え続けます」
→ まず /skill axiom-memory-debugging を呼び出し、スタッターが残る場合は /skill axiom-performance-profiling を呼び出します
ユーザー:「アプリは初回起動時に数秒間フリーズしますが、その後は正常に動作します」
→ 呼び出し:/skill axiom-hang-diagnostics
ユーザー:「複数の API 呼び出しが同時に返ると UI が固まります」
→ 別ルート:/skill axiom-ios-concurrency(コールバックの競合)
ユーザー:「ユーザーがスクロールするとタイマーが止まります」
→ 呼び出し:/skill axiom-timer-patterns
ユーザー:「タイマーコードで EXC_BAD_INSTRUCTION クラッシュが発生します」
→ 呼び出し:/skill axiom-timer-patterns
ユーザー:「Timer と DispatchSourceTimer のどちらを使うべきですか?」
→ 呼び出し:/skill axiom-timer-patterns
ユーザー:「AsyncTimerSequence を作成するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-timer-patterns-ref
ユーザー:「Swift コードをレビューして、古くなったパターンがないか確認してください」
→ 呼び出し:/skill axiom-swift-modern
ユーザー:「これをもっと現代的な方法で実現できますか?」
→ 呼び出し:/skill axiom-swift-modern
ユーザー:「アプリのログを確認したいです。コンソール出力を見るにはどうすればよいですか?」
→ 呼び出し:/skill axiom-xclog-ref または /axiom:console
ユーザー:「このバグを再現している間のシミュレーターのログを取得してください」
→ 呼び出し:/skill axiom-xclog-ref または /axiom:console