关于 dotnet-performance-review
dotnet-performance-review 是用于 .NET API 源码的只读静态审查技能。它扫描性能反模式,按严重程度分类并报告证据,不会修改代码。
主要功能
- 01按信号选择扫描主题
- 02使用 grep 检查并统计命中数
- 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→ async;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确认热路径收益)。
正确性规则(避免过度标记)
- 在异步方法中使用
Memory<T>,而不是Span<T>(符合我们的异步规范)。 - 仅在热路径上避免 LINQ(自 .NET 7 起,
Min/Max/Sum/Average已向量化 — 不要一概禁止)。 - 仅在库代码中使用
ConfigureAwait(false)(例如{{ProjectName}}.Shared),不要在 API/处理程序中使用。 - 仅对频繁同步完成的热路径使用
ValueTask;仅对编译时字面量模式使用[GeneratedRegex]。 - 没有基准测试证据时,绝不建议使用
unsafe/CollectionsMarshal.AsSpan。
我们与上游扫描器的不同之处
Microsoft 版本会将未密封类标记为结构性性能问题。我们不会 — 我们的标准有意将“密封你的类”(CA1852/MA0053 → 建议)排除在外,因为领域模型使用了有意设计的继承。跳过未密封类问题(或严格限定为内部非领域热类型),绝不要建议密封领域实体/聚合。