关于 m10-performance
面向 Rust 开发者的性能优化技能,帮助判断是否需要优化以及如何着手。它强调先分析和测量瓶颈,再选择实现手段并权衡取舍。
主要功能
- 01优化前先分析与基准测试
- 02比较算法和数据结构选择
- 03减少分配与数据复制
- 04评估缓存利用和并行处理
适用场景
- 01排查疑似 CPU 热点
- 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
- 找出实际的热点
-
优先级是什么?
- 算法(提升 10x-1000x)
- 数据结构(提升 2x-10x)
- 分配(提升 2x-5x)
- 缓存(提升 1.5x-3x)
-
权衡是什么?
- 复杂度与速度
- 内存与 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-* | 每秒有多少请求? |
| 内存限制 | 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