m10-performance について
Rust 開発者向けに、最適化の要否と進め方を検討するスキルです。まずプロファイルやベンチマークでボトルネックを測定し、実装手法とトレードオフを選びます。
主な機能
- 01最適化前のプロファイルと測定
- 02アルゴリズムとデータ構造の比較
- 03割り当てとコピーの削減
- 04キャッシュ利用と並列処理の検討
活用シーン
- 01CPU のホットスポットの調査
- 02性能を考慮したコレクションの選択
- 03ホットパスでのメモリ割り当て削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill m10-performanceインストール後、Claude Code で/m10-performanceを入力して読み込まれたか確認します。
同梱ファイルpatterns/optimization-guide.md
詳細
パフォーマンスの最適化
レイヤー 2:設計上の選択
核となる問い
ボトルネックは何ですか? 最適化する価値はありますか?
最適化する前に、次の点を確認してください。
- 測定しましたか?(推測で判断しないでください)
- 許容できるパフォーマンスはどの程度ですか?
- 最適化によって複雑さが増しませんか?
パフォーマンス上の判断 → 実装
| 目標 | 設計上の選択 | 実装 |
|---|---|---|
| アロケーションを減らす | 事前確保、再利用 | with_capacity、オブジェクトプール |
| キャッシュを改善する | データを連続配置する | Vec、SmallVec |
| 並列化する | データ並列性 | rayon、スレッド |
| コピーを避ける | ゼロコピー | 参照、Cow<T> |
| 間接参照を減らす | データをインライン化する | smallvec、配列 |
検討のためのプロンプト
最適化する前に、次の点を確認してください。
-
測定しましたか?
- まずプロファイルを取得します → flamegraph、perf
- ベンチマークを実行します → criterion、cargo bench
- 実際のホットスポットを特定します
-
何を優先しますか?
- アルゴリズム(10~1000 倍の改善)
- データ構造(2~10 倍)
- アロケーション(2~5 倍)
- キャッシュ(1.5~3 倍)
-
トレードオフは何ですか?
- 複雑さと速度
- メモリと CPU
- レイテンシとスループット
上方向にたどる ↑
ドメインの制約(レイヤー 3)へ:
"How fast does this need to be?"
↑ Ask: What's the performance SLA?
↑ Check: domain-* (latency requirements)
↑ Check: Business requirements (acceptable response time)
| 質問 | たどる先 | 確認事項 |
|---|---|---|
| レイテンシの要件 | domain-* | 許容できる応答時間はどの程度ですか? |
| スループットの要件 | domain-* | 1 秒あたり何件のリクエストが必要ですか? |
| メモリの制約 | domain-* | メモリの予算はどの程度ですか? |
下方向にたどる ↓
実装(レイヤー 1)へ:
"Need to reduce allocations"
↓ m01-ownership: Use references, avoid clone
↓ m02-resource: Pre-allocate with_capacity
"Need to parallelize"
↓ m07-concurrency: Choose rayon or threads
↓ m07-concurrency: Consider async for I/O-bound
"Need cache efficiency"
↓ Data layout: Prefer Vec over HashMap when possible
↓ Access patterns: Sequential over random access
クイックリファレンス
| ツール | 用途 |
|---|---|
cargo bench | マイクロベンチマーク |
criterion | 統計的なベンチマーク |
perf / flamegraph | CPU プロファイリング |
heaptrack | アロケーションの追跡 |
valgrind / cachegrind | キャッシュの分析 |
最適化の優先順位
1. Algorithm choice (10x - 1000x)
2. Data structure (2x - 10x)
3. Allocation reduction (2x - 5x)
4. Cache optimization (1.5x - 3x)
5. SIMD/Parallelism (2x - 8x)
よく使われる手法
| 手法 | 使用する場面 | 方法 |
|---|---|---|
| 事前確保 | サイズが既知の場合 | Vec::with_capacity(n) |
| クローンを避ける | ホットパス | 参照または Cow<T> を使用する |
| 操作をバッチ処理する | 小さな操作が多い場合 | 収集してから処理する |
| SmallVec | 通常は小さい場合 | smallvec::SmallVec<[T; N]> |
| インラインバッファー | 固定サイズのデータ | Vec ではなく配列を使用する |
よくある間違い
| 間違い | 問題点 | より良い方法 |
|---|---|---|
| プロファイリングせずに最適化する | 対象を誤る | まずプロファイルを取得する |
| デバッグモードでベンチマークする | 意味がない | 常に --release を指定する |
| LinkedList を使う | キャッシュ効率が悪い | Vec または VecDeque を使う |
隠れた .clone() | 不要なアロケーション | 参照を使う |
| 時期尚早な最適化 | 労力の浪費 | まず動くものを作る |
アンチパターン
| アンチパターン | 問題点 | より良い方法 |
|---|---|---|
| ライフタイムを避けるためにクローンする | パフォーマンスの低下 | 適切な所有権を使う |
| すべてを Box に入れる | 間接参照のコスト | 可能な場合はスタックを使う |
| 小さな集合に HashMap を使う | オーバーヘッド | 線形探索を行う Vec |
| ループ内で文字列を連結する | O(n^2) | String::with_capacity または format! |
関連スキル
| 場面 | 参照先 |
|---|---|
| クローンの削減 | m01-ownership |
| 並行処理の選択肢 | m07-concurrency |
| スマートポインターの選択 | m02-resource |
| ドメイン要件 | domain-* |
コメント
Markdown 対応