用途
本技能面向 Rust 性能优化、性能剖析与高性能系统开发。核心目标是做出有证据支撑的优化,避免过早优化。适用于需要降低延迟、提升吞吐、减少内存占用或改善缓存局部性的 Rust 项目。
核心原则
- 正确性优先于速度:任何优化前先用测试证明正确性。
- 先测量:没有剖析数据就不优化。
- 算法优先:更好的算法胜过微优化。
- 面向数据的设计:缓存友好的数据布局很重要。
- 基于证据:每次优化都必须有可复现基准证明可测量的改进。
关键规则:如果优化改变了解析、I/O 或浮点格式化,必须在基准测试之前添加或扩展回归测试。
优化工作流
- BASELINE:用测试建立当前行为基线
- TEST:为将要修改的代码添加回归测试
- OPTIMIZE:实施改动
- VERIFY:运行测试证明正确性未变
- BENCHMARK:此时才测量改进
实践中:
cargo test # 1-2. 验证基线并添加回归测试
# ... 实施优化 ...
cargo test # 4. 验证正确性未变
cargo bench # 5. 测量改进
主要能力
性能剖析
- 使用 perf、samply 或 Instruments 进行 CPU 剖析
- 使用 heaptrack 或 valgrind 进行内存剖析
- 识别热点路径与瓶颈
- 分析缓存行为
常用命令:
# CPU 剖析(samply)
cargo build --release
samply record ./target/release/my-app
# 内存剖析(heaptrack)
heaptrack ./target/release/my-app
heaptrack_gui heaptrack.my-app.*.gz
# 缓存分析(cachegrind)
valgrind --tool=cachegrind ./target/release/my-app
# 火焰图
cargo flamegraph -- <args>
基准测试
- 编写 Criterion 基准
- 建立性能基线
- 对比不同实现
- 在 CI 中检测性能回退
构建配置示例(参考 ripgrep 做法):
[profile.release]
opt-level = 3
lto = "thin"
codegen-units = 1
[profile.release-lto]
inherits = "release"
lto = "fat"
[profile.bench]
inherits = "release"
debug = true # 启用剖析符号
重要:基准报告中必须注明所用的构建配置。
优化技术
- 减少分配(复用缓冲区、SmallVec)
- 面向数据的设计(AoS 改为 SoA 以改善缓存局部性)
- 零拷贝解析(使用 Cow 借用输入)
- SIMD 优化(portable-simd 或显式 intrinsics)
- 字符串优化(字符串驻留、CompactString)
并发模式
- 使用 crossbeam 的无锁数据结构(epoch 回收、ArrayQueue)
- 使用 Rayon 的数据并行(par_iter、par_chunks、自定义线程池)
- 原子操作与内存序(Relaxed/Acquire/Release/AcqRel/SeqCst 的适用场景)
- 避免伪共享(用 #[repr(align(64))] 填充到独立缓存行)
并发纪律:研究阶段用 Amdahl 定律剖析串行瓶颈;设计阶段为每个原子操作说明内存序理由;验证阶段对无锁代码强制使用 loom 和 ThreadSanitizer。
构建优化与分发
- 体积优化配置(opt-level = "z"、strip、panic = "abort")
- 符号剥离策略(none/debuginfo/symbols 的适用场景)
- 特性门控(feature gates)条件编译
- 使用 cross 交叉编译
- 自定义分配器(jemalloc、bumpalo arena 分配)
编译器提示与内存布局
- #[cold]、#[inline(always)]、#[inline(never)]、#[target_feature]
- 用 size_of/align_of 检查结构体大小与对齐,优化字段顺序减少填充
使用方式
按优化工作流执行:先建立基线并添加回归测试,再实施优化,验证正确性后运行基准。性能相关 PR 需包含:回归测试、基准脚本(Criterion 或 hyperfine)、同机器前后对比数据、明确注明的构建配置;若改进超过 50%,需附火焰图/perf 证据;若涉及 unsafe 代码,需记录不变量并附证明测试。
适用场景
- Rust 库或应用的性能调优
- 高吞吐/低延迟系统开发
- 内存占用优化
- 并发与并行代码优化
- 构建体积与分发优化
限制与约束
- 绝不在没有正确性测试的情况下优化
- 绝不在未注明构建配置的情况下做基准
- 记录优化原因,冷路径保持可读代码
- 在代表性数据上测量,充分测试优化代码(含边界情况)
- 权衡维护成本与性能收益
成功指标:优化前后正确性测试均通过、可测量的性能改进(重大改动 >10%)、无正确性回退、为优化路径添加基准、记录构建配置与机器规格、记录内存使用、注释中说明优化理由、前后数据可被他人复现。