profile-dart-code について
DartのコマンドラインプログラムのCPU実行を分析するスキルと補助スクリプトです。VM Serviceでサンプルを収集し、CPU使用量順に関数を表示して、全プロファイルをJSONに出力します。
主な機能
- 01Dart VMのCPUサンプル収集
- 02サンプル使用率順の関数表示
- 03生のJSONプロファイル出力
- 04サンプリング間隔と出力先の指定
活用シーン
- 01Dart CLIのCPU負荷が高い関数の特定
- 02高コストなループや呼び出しの調査
- 03最適化前後のプロファイル比較
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kevmoo/ dash_skills --skill profile-dart-codeインストール後、Claude Code で/profile-dart-codeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonscripts/pubspec.yamlscripts/bin/profile.dartscripts/test/profile_test.dart詳細
Dart の CPU プロファイリング
Dart のコマンドラインアプリケーションで CPU プロファイルを取得し、ボトルネックを特定するためのガイドラインと自動化ツールです。
このスキルを使用する場合
- Dart スクリプトや CLI ツールの CPU 実行をプロファイリング、最適化、またはベンチマークするよう依頼された場合。
- ホットループ、負荷の高い関数呼び出し、または予期しない実行オーバーヘッドを調査する場合。
使用しない場合(使用を控えるためのガードレール)
次の場合は、このスキルを使用してプロファイリングしないでください。
- 純粋な I/O 待ちによるボトルネック:パフォーマンスのボトルネックが CPU 実行ではなく、ネットワーク遅延、データベースクエリ、またはディスク I/O 待ちである場合。
- Flutter UI アプリケーション:対象が、フレームのプロファイリング、ラスタースレッドの調査、またはウィジェットの再ビルド追跡を必要とする Flutter アプリケーションである場合(Flutter DevTools または
widget_inspectorを使用してください)。 - 短時間のマイクロベンチマーク:VM のウォームアップとサンプリングのオーバーヘッドによって結果が偏る、数ミリ秒しか実行されないマイクロベンチマークの場合(代わりに
package:benchmark_harnessまたはpackage:bench_pressを使用してください)。 - 対象が正常に実行できない場合:対象のスクリプトがコンパイルに失敗する、または起動時にクラッシュする場合は、CPU プロファイリングを試みる前に機能上のバグを修正してください。
ワークフロー
- コンパイルが正常であることを確認する:対象の Dart スクリプトが問題なく実行されることを確認します(
dart run <script.dart>)。 - プロファイラースクリプトを実行する:このスキルのディレクトリにある自動プロファイリングヘルパースクリプトを使い、VM Service の監視機能を有効にして対象アプリを起動し、CPU サンプルを取得して、消費量の多い関数を出力します。
- 分析して最適化する:ツールが報告する自己サンプルと合計サンプルの割合を確認し、ボトルネック(過剰なオブジェクト割り当て、コストの高いハッシュ計算、仮想ディスパッチのオーバーヘッドなど)を特定します。
プロファイラーヘルパースクリプトの実行
このリポジトリには、依存関係を追加せず(公式の vm_service のみを使用)、任意の Dart ファイルを起動して VM Service に接続し、実行が完了するまで待機し(--pause-isolates-on-exit)、CPU サンプルを取得して、わかりやすい概要を出力するとともに、完全な JSON プロファイルを書き出すプロファイリングスクリプトが含まれています。
任意の作業ディレクトリから実行します。
dart run <dash_skills_repo>/skills/profile-dart-code/scripts/bin/profile.dart --out=cpu_profile.json -- <path_to_target.dart> [target_arguments...]
スクリプトの引数
-o, --out=<file>:生の JSON CPU プロファイルを保存する出力ファイルのパス(既定値:cpu_profile.json)。-p, --period=<micros>:サンプリング間隔(マイクロ秒、既定値:1000µs = 1ms)。最小値は50µs です。-- <target.dart> [args...]:プロファイリングする Dart スクリプトと、main()に渡す引数です。
警告
ハングする可能性があります:VM サービスを使用して Dart の対象をプロファイリングまたはデバッグしているときに、対象の例外や接続の問題によってプロセスが無期限にハングすることがあります。対象のスクリプトでタイムアウトを処理できるようにし、プロセスの出力を監視してください。
出力例
Connecting to VM service at ws://127.0.0.1:8181/ws...
Target execution paused at exit. Retrieving CPU profile samples...
=== Top CPU Functions (Self Samples) ===
1. _PuzzleSmart._shiftSlice (self: 34.2%, total: 41.0%)
2. _countInversions (self: 18.5%, total: 18.5%)
3. shortestPaths (self: 12.1%, total: 98.4%)
Saved complete JSON profile to: cpu_profile.json
プロファイルを解釈する際のベストプラクティス
- 自己の割合と合計の割合に注目する:
self %が高い場合、関数本体内で CPU 時間が直接費やされている場所(計算、ループ分岐、配列インデックス参照など)を示します。self %が低くtotal %が高い場合は、ディスパッチャーまたは外側のオーケストレーションループを示します。 - 隠れたオーバーヘッドを探す:タイトなループ内での暗黙的なオブジェクト割り当て(
_copyData、イテレーターラッパー、クロージャーの作成など)に注意してください。 - 最適化を実測で検証する:最適化を適用する前後で、ベースラインのサンプル数と実行時間(
time -v)を必ず記録してください。
コメント
Markdown 対応