dart-optimization について
最適化、デバッグ、適切なエラー処理の指針を求める Dart 開発者向けのスキルです。型安全性、コレクションやループの使い方、コンパイル時の手法、プロファイリング、ベンチマーク、Flutter のホットリロードと再起動を扱います。
主な機能
- 01Dart の型と null 安全性の指針
- 02コレクションとホットループの実践
- 03コンパイル時最適化の手法
- 04CPU プロファイリングとベンチマーク
- 05ホットリロードと再起動の指針
活用シーン
- 01Dart コードの性能問題の確認
- 02性能が重要な処理でのコレクション選択
- 03CPU 負荷の高い関数の調査
- 04null と復旧可能な例外への対処
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-optimizationインストール後、Claude Code で/dart-optimizationを入力して読み込まれたか確認します。
詳細
最適化とデバッグ
Dart のパフォーマンスは UI レンダリングにとどまりません。効率的な実行、スマートなリソース活用、そして堅牢なエラー処理が重要です。
Dart のパフォーマンスパターン
- 型の標準化:
dynamicは避けてください。明示的な型またはObject?を使用します。静的に型付けされたコードにより、コンパイラははるかに優れた最適化を実行できます。 - 効率的なコレクション:
- 平均 O(1) の含有チェックには
Setを使用します。 - 順序付きのインデックスアクセスには
Listを使用します。 - 可読性のために
Iterableのメソッド(map、where)を優先しますが、パフォーマンスが重要なホットパスではforループを使用します。
- 平均 O(1) の含有チェックには
- インライン化: 小さな getter や単純な関数は VM/AOT によってインライン化されることが多いですが、それらをシンプルに保つことでこの最適化が確実に行われます。
コンパイル時の最適化
- Final と Const: 可能な限り変数を
finalとして宣言します。ウィジェットやデータモデルにはconstコンストラクターを使用して、コンパイル時の割り当てを可能にし、実行時のガベージコレクションの負荷を軽減します。 - 三項演算子と If-Else: Dart では一般的に同等ですが、可読性を優先します。網羅的で効率的なパターンマッチングには
switch式(Dart 3 以降)を使用します。 - 拡張型: 型のラッピングには Dart 3.3 以降の
extension typeによるゼロコスト抽象化を使用して、実行時の割り当てオーバーヘッドを排除します(dart-modern-syntax を参照)。 - プライベート名前付きパラメーター: 初期化リストのコードボイラープレートを排除するには、Dart 3.12 以降の
MyClass({this._privateField})コンストラクターを使用します(dart-modern-syntax を参照)。
ホットパスとループ
- ループ内の処理を最小化: 計算やオブジェクト生成はループの外に抽出します。
- コレクションリテラル: 簡潔さとわずかなパフォーマンス向上のために、
List()のようなコンストラクターではなく、リテラル構文[]や{}を使用します。
型システムと健全性
Dart の健全な型システムを徹底し、実行時の無効な状態を防ぎます。
- メソッドのオーバーライド: 健全な戻り値の型(共変)とパラメーターの型(反変)を維持します。
covariantキーワードで明示的にマークされていない限り、サブクラスでパラメーターの型を狭めてはいけません。 - ジェネリクスとコレクション: ジェネリッククラス(例:
List<T>)に明示的な型注釈を追加します。List<dynamic>を型付きリストに代入してはいけません。 - ダウンキャスト:
dynamicからの暗黙的なダウンキャストは避けます。必要な場合は明示的なキャスト(例:as List<Cat>)を使用しますが、TypeError例外を防ぐために基になる実行時の型が一致することを確認します。 - 厳密なキャスト:
analysis_options.yamlでstrict-casts: trueを有効にして、明示的なキャストを強制し、暗黙的なダウンキャストエラーをコンパイル時に検出します。
Null 安全とエラー処理
変数の初期化と null 許容性を正しく管理することで、null 安全に関連する静的エラーを排除します。
- 修飾子: null 許容型には
?、null アサーションには!、null であってはならない名前付きパラメーターにはrequiredを適用します。 - 遅延初期化: 使用前に初期化されることが保証されている非 null 許容変数には
lateキーワードを使用します。 - キャッチ: 回復可能な失敗には
Exceptionのサブタイプをキャッチします。 - エラー:
Errorやそのサブタイプ(例:TypeError、ArgumentError)を明示的にキャッチしてはいけません。エラーは修正すべきプログラミングのバグを示すものであり、キャッチするものではありません。 - 再スロー:
catchブロック内でrethrowを使用して、元のスタックトレースを保持したまま例外を伝播させます。
プロファイリングとデバッグ
- DevTools CPU プロファイラー: ホットパスと「重い」関数を特定します。
- ベンチマーク: UI 以外のロジックの科学的なパフォーマンス測定には
package:benchmark_harnessを使用します。 - ホットリロードとホットリスタート: UI の変更にはホットリロードを使用します。状態の初期化や実行時エラーを引き起こす深いロジックの変更には、ホットリスタートを使用して状態ツリーをクリアします。
コメント
Markdown 対応