dotnet-performance-review について
dotnet-performance-reviewは、.NET APIのソースを対象とする読み取り専用の静的レビュー用スキルです。性能アンチパターンを検出して重大度別に根拠を報告し、コードは変更しません。
主な機能
- 01シグナルに基づくスキャン対象の選定
- 02grepによる検査と正確なヒット数
- 03重大度と件数による分類
- 04問題箇所と修正案の提示
- 05根拠のない最適化判断の回避
活用シーン
- 01.NET APIコードの性能リスクのレビュー
- 02非同期・メモリ・コレクション・正規表現・I/Oパターンの確認
- 03ベンチマーク検証に向けた指摘事項の整理
MCP 対応
コードの読み取り・検索・ナビゲーションにはSerena MCPが必須で、事前にツールマニュアルを読み込む必要があります。スキャンは読み取り専用です。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ atherio-danp/ cde-dotnetcc --skill dotnet-performance-reviewインストール後、Claude Code で/dotnet-performance-reviewを入力して読み込まれたか確認します。
詳細
コードのレビューには Serena MCP が必須です(ここでは読み取り専用)。 まず
mcp__serena__initial_instructionsを呼び出して Serena ツールのマニュアルを読み込み、その後、コードの読み取り/検索/ナビゲーションにはすべて Serena を使用してください。ファイル全体の読み取りより、シンボルナビゲーション(get_symbols_overview/find_symbol/find_referencing_symbols)を優先してください。
.NET パフォーマンスレビュー(読み取り専用スキャン)
{{ProductName}} .NET API 向けの静的な読み取り専用アンチパターンスキャナーです。問題を報告しますが、編集は行いません。architect-backend レビューおよび microbenchmarking(修正をエビデンスで確認するため)と組み合わせて使用します。coding-standards.md および非同期処理の規則に準拠しています。
入力: スキャン対象のソース(必須)、ホットパスのコンテキストとターゲットフレームワーク(.NET 10)、深度 =
critical-only / standard(デフォルト)/ comprehensive。
ワークフロー
- シグナルの検出 → トピックの選択。 シグナルをスキャンしてトピックを選択します:
async/await/Task/ValueTask→ 非同期処理;Span</stackalloc/ArrayPool/Substring/.Replace/.ToLower/ループ内の+=→ メモリと文字列;Regex/[GeneratedRegex]→ 正規表現;Dictionary</List</.ToList()/LINQ → コレクション;JsonSerializer/HttpClient/Stream→ I/O とシリアル化。 - スキャンし、grep で確認(正確なヒット数を含むチェックリストを出力します。ヒット数 0 も有効な結果です):
grep -n '\.Substring('·grep -En '\.(StartsWith|EndsWith|Contains)\s*\('(StringComparisonが指定されていない場合)·grep -n '\.ToLower()\|\.ToUpper()'(StringComparison.OrdinalIgnoreCaseを使用)·grep -n 'new HttpClient('(先にIHttpClientFactoryを確認)·grep -n 'RegexOptions.Compiled'とgrep -n 'GeneratedRegex'(リテラルパターンにはソース生成を優先)·grep -n 'static readonly Dictionary<'(変更されない場合に限りFrozenDictionaryの候補)。- 逆パターンを確認: 該当しないパターンについては比率を報告します(例:「7 件中 3 件が
StringComparisonを使用」)。
- 分類: 🔴 重大(デッドロック/クラッシュ/セキュリティ/10 倍超)、🟡 中程度(2~10 倍/ホットパスのベストプラクティス)、 ℹ️ 情報。ホットパスのコードは重大度を引き上げます。11~50 件は情報→中程度に引き上げ、50 件以上は体系的な問題として扱います。件数を報告してください。
- 報告 各指摘を簡潔にまとめます:
#### ID. タイトル(N 件)/ 影響 / ファイルはFile.cs:L42形式 / 修正方法 / 任意の注意点。重大度ごとにまとめ、最後にサマリーテーブルを記載してください。最後に非決定性に関する注意書き(LLM によるスキャンは手がかりであり、証明ではありません。ホットパスでの効果はmicrobenchmarkingで確認してください)を添えてください。
正確性に関するルール(過剰に指摘しない)
- 非同期メソッドでは
Span<T>ではなくMemory<T>を使用します(非同期処理の規律に準拠)。 - LINQ を使用するのはホットパスのみです(.NET 7 以降の
Min/Max/Sum/Averageはベクトル化されているため、全面的に禁止しません)。 ConfigureAwait(false)はライブラリコード(例:{{ProjectName}}.Shared)でのみ使用し、API/ハンドラーでは使用しません。ValueTaskは頻繁に同期的に完了するホットパスでのみ使用します。[GeneratedRegex]はコンパイル時にリテラルで指定されたパターンにのみ使用します。- ベンチマークによるエビデンスなしに
unsafe/CollectionsMarshal.AsSpanを推奨しないでください。
上流のスキャナーとの相違点
Microsoft 版は、シールされていないクラスを構造上のパフォーマンス問題として指摘します。当プロジェクトでは指摘しません。標準ではドメインモデルが意図的な継承を使用しているため、「クラスをシールする」(CA1852/MA0053 → 提案)をあえて対象外にしています。シールされていないクラスに関する指摘はスキップしてください(または、内部の非ドメイン系ホット型に厳密に限定してください)。ドメインエンティティ/集約のシールを提案してはいけません。