mcpField
A
axiom-ios-performance

axiom-ios-performance

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

axiom-ios-performance について

iOS 開発者向けのパフォーマンス問題ルーティングスキルです。メモリ、応答性、電力、タイマーなどの症状に応じて、調査に適したスキルやエージェントへ案内します。

主な機能

  1. 01症状別の専門スキルへの案内
  2. 02メモリ、ハング、電力問題の切り分け
  3. 03GUI とコマンドラインの分析経路
  4. 04自動監査とプロファイリング依頼の案内

活用シーン

  1. 01アプリが遅いときの調査開始点の選定
  2. 02メモリ増加やリークの調査
  3. 03アプリのフリーズやバッテリー消費の診断
  4. 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

  • コマンド構文の完全な説明
  • ブレークポイントのレシピ
  • 式の評価パターン

判断ツリー

  1. メモリが増加し、UI がカクつく/ジャンクする場合は? → まず memory-debugging(メモリプレッシャーによって GC の一時停止が発生し、フレームが落ちるため)、メモリを改善してもカクつきが残る場合は performance-profiling
  2. メモリリーク(Swift)の場合は? → memory-debugging
  3. メモリリーク(Objective-C ブロック)の場合は? → objc-block-retain-cycles
  4. アプリがハング/フリーズする場合、UI が完全に応答しませんか(タップできず、反応もない)?
    • はい → hang-diagnostics(ビジー状態かブロック状態かを診断)
    • いいえ、単に遅いだけ → performance-profiling(Time Profiler)
    • 初回起動時だけですか? → hang-diagnostics で同期 I/O または遅延初期化も確認
  5. 複数の非同期処理が同時に完了すると遅くなる場合は? → axiom-ios-concurrency に誘導(プロファイリングではなく、コールバックの競合)
  6. バッテリー消費(症状がわかっている)の場合は? → energy-diag
  7. バッテリー消費(API リファレンスが必要)の場合は? → energy-ref
  8. バッテリー消費(一般)の場合は? → energy
  9. MetricKit の設定/解析の場合は? → metrickit-ref
  10. GUI(Instruments)でプロファイリングする場合は? → performance-profiling
  11. CLI(xctrace)でプロファイリングする場合は? → xctrace-ref
  12. 今すぐ自動プロファイリングを実行する場合は? → performance-profiler エージェント
  13. 全般的に遅い/ラグがある場合は? → performance-profiling
  14. 先回りしてメモリリークをスキャンする場合は? → memory-auditor(Agent)
  15. エネルギー関連のアンチパターンをスキャンする場合は? → energy-auditor(Agent)
  16. Swift のパフォーマンス監査(ARC、ジェネリクス、コレクション)が必要な場合は? → swift-performance-analyzer(Agent)
  17. 実行時の変数/スレッド状態を調査する必要がある場合は? → axiom-lldb
  18. LLDB コマンドの正確な構文が必要な場合は? → axiom-lldb-ref
  19. スクロール中にタイマーが停止する場合は? → timer-patterns(RunLoop モード)
  20. DispatchSourceTimer で EXC_BAD_INSTRUCTION クラッシュが発生する場合は? → timer-patterns(4 つのクラッシュパターン)
  21. Timer、DispatchSourceTimer、Combine タイマー、async タイマーのどれを選ぶか迷う場合は? → timer-patterns
  22. タイマー API の構文/ライフサイクルが必要な場合は? → timer-patterns-ref
  23. 古い Swift パターンのコードレビューが必要な場合は? → swift-modern
  24. Claude がレガシー API(DateFormatter、CGFloat、DispatchQueue)を生成する場合は? → swift-modern
  25. プロファイリング前に実行時のコンソール出力を確認する必要がある場合は? → 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

コメント