swiftui-performance-audit について
コードレビューと Instruments のトレース分析から、SwiftUI の性能問題の特定、修正案、基準値との比較まで扱うスキルです。ビューの遅延を調べる開発者向けです。
主な機能
- 01コードからの性能レビュー
- 02Instruments 分析の案内
- 03トレースに基づく診断
- 04個別の修正案
- 05修正前後の検証
活用シーン
- 01ビューの再評価頻発の調査
- 02リストスクロール遅延の調査
- 03body 内の高負荷処理の確認
- 04修正前後の性能比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ steipete/ agent-scripts --skill swiftui-performance-auditインストール後、Claude Code で/swiftui-performance-auditを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/demystify-swiftui-performance-wwdc23.mdoptimizing-swiftui-performance-instruments.mdunderstanding-hangs-in-your-app.mdunderstanding-improving-swiftui-performance.md詳細
SwiftUI パフォーマンス監査
出典:@Dimillian の Dimillian/Skills からコピー(2025-12-31)。
概要
計測とベースラインの作成から、根本原因の分析、具体的な改善手順まで、SwiftUI のビューのパフォーマンスをエンドツーエンドで監査します。
ワークフローの判断ツリー
- ユーザーがコードを提示した場合は、「コード優先レビュー」から始めます。
- ユーザーが症状だけを説明した場合は、必要最小限のコードとコンテキストを尋ねてから、「コード優先レビュー」を行います。
- コードレビューで結論が出ない場合は、「ユーザーをプロファイリングに導く」に進み、トレースまたはスクリーンショットを依頼します。
1. コード優先レビュー
収集する情報:
- 対象となるビュー/機能のコード。
- データフロー:状態、環境、監視対象のモデル。
- 症状と再現手順。
注目する点:
- 広範な状態変更によるビュー無効化の多発。
- リスト内の不安定な識別性(
idの頻繁な変更、レンダリングごとのUUID())。 body内の重い処理(書式設定、ソート、画像デコード)。- レイアウトの過剰な再計算(深くネストされたスタック、
GeometryReader、Preference の連鎖)。 - ダウンサンプリングやサイズ変更を行っていない大きな画像。
- 過剰にアニメーションする階層構造(大きなツリーに対する暗黙的なアニメーション)。
提示するもの:
- コード上の参照箇所とともに、考えられる根本原因。
- 推奨する修正とリファクタリング。
- 必要に応じて、最小限の再現例または計測方法の提案。
2. ユーザーをプロファイリングに導く
Instruments でデータを収集する方法を説明します。
- Instruments の SwiftUI テンプレートを使用します(Release ビルド)。
- 実際の操作(スクロール、画面遷移、アニメーション)を再現します。
- SwiftUI タイムラインと Time Profiler を記録します。
- 関連するレーンとコールツリーをエクスポートするか、スクリーンショットを撮ります。
依頼するもの:
- トレースのエクスポート、または SwiftUI レーンと Time Profiler のコールツリーのスクリーンショット。
- デバイス/OS/ビルド設定。
3. 分析と診断
SwiftUI でよくある原因を優先して確認します。
- 広範な状態変更によるビュー無効化の多発。
- リスト内の不安定な識別性(
idの頻繁な変更、レンダリングごとのUUID())。 body内の重い処理(書式設定、ソート、画像デコード)。- レイアウトの過剰な再計算(深くネストされたスタック、
GeometryReader、Preference の連鎖)。 - ダウンサンプリングやサイズ変更を行っていない大きな画像。
- 過剰にアニメーションする階層構造(大きなツリーに対する暗黙的なアニメーション)。
トレースやログの証拠を添えて、調査結果をまとめます。
4. 改善
対象を絞った修正を適用します。
- 状態の適用範囲を狭めます(
@State/@Observableを末端のビューに近づけます)。 ForEachとリストの識別性を安定させます。- 重い処理を
bodyの外に移します(事前計算、キャッシュ、@State)。 - コストの高いサブツリーには
equatable()または値ラッパーを使用します。 - 描画前に画像をダウンサンプリングします。
- レイアウトの複雑さを軽減するか、可能な場合は固定サイズを使用します。
よくあるコードの問題(と修正方法)
コードレビュー中に、次のパターンがないか確認します。
body 内でのコストの高いフォーマッター
var body: some View {
let number = NumberFormatter() // slow allocation
let measure = MeasurementFormatter() // slow allocation
Text(measure.string(from: .init(value: meters, unit: .meters)))
}
モデルまたは専用ヘルパーにフォーマッターをキャッシュすることをおすすめします。
final class DistanceFormatter {
static let shared = DistanceFormatter()
let number = NumberFormatter()
let measure = MeasurementFormatter()
}
重い処理を行う計算プロパティ
var filtered: [Item] {
items.filter { $0.isEnabled } // runs on every body eval
}
変更時に事前計算またはキャッシュすることをおすすめします。
@State private var filtered: [Item] = []
// update filtered when inputs change
body または ForEach 内でのソート/フィルタリング
List {
ForEach(items.sorted(by: sortRule)) { item in
Row(item)
}
}
ビューの更新前に一度だけソートすることをおすすめします。
let sortedItems = items.sorted(by: sortRule)
ForEach 内でのインラインフィルタリング
ForEach(items.filter { $0.isEnabled }) { item in
Row(item)
}
識別性が安定したフィルタリング済みのコレクションを使用することをおすすめします。
不安定な識別性
ForEach(items, id: \.self) { item in
Row(item)
}
安定しない値に id: \.self を使用するのは避け、安定した ID を使用してください。
メインスレッドでの画像デコード
Image(uiImage: UIImage(data: data)!)
メインスレッド以外で画像をデコード/ダウンサンプリングし、その結果を保存することをおすすめします。
監視対象モデルの広範な依存関係
@Observable class Model {
var items: [Item] = []
}
var body: some View {
Row(isFavorite: model.items.contains(item))
}
更新の波及を抑えるため、粒度の細かいビューモデルまたはアイテムごとの状態を使用することをおすすめします。
5. 検証
同じ計測を再実行し、ベースラインの指標と比較するようユーザーに依頼します。 結果が提示された場合は、差分(CPU、フレーム落ち、メモリのピーク)をまとめます。
成果物
次の内容を提示します。
- 短い指標の表(利用可能な場合は変更前/変更後)。
- 影響度順に並べた主な問題。
- 推定工数を添えた修正案。
参考資料
ユーザーから提供された Apple のドキュメントや WWDC のリソースは、references/ の下に追加します。
- Instruments を使った SwiftUI のパフォーマンス最適化:
references/optimizing-swiftui-performance-instruments.md - SwiftUI のパフォーマンスを理解して改善する:
references/understanding-improving-swiftui-performance.md - アプリのハングを理解する:
references/understanding-hangs-in-your-app.md - SwiftUI のパフォーマンスを解き明かす(WWDC23):
references/demystify-swiftui-performance-wwdc23.md