性能优化与安全权衡
原理
性能优化的关键在于测量而非直觉。使用 criterion 基准测试 + flamegraph 分析热点。
缓存友好设计:连续内存访问(Vec > LinkedList)利用 CPU 预取器和缓存行(64B)。结构体字段排序影响内存对齐填充(#[repr(C)] 固定布局)。
内存分配优化:
Vec::with_capacity(n)预分配避免 reallocString::with_capacity(n)同理- 小对象使用
smallvec/tinyvec(栈上内联存储) - 使用
bytescrate 实现零拷贝 buffer
编译器优化:#[inline] / #[inline(always)] 控制内联;Profile-Guided Optimization(PGO)用运行时数据指导优化;BOLT 进一步优化二进制布局。
安全与性能的权衡:边界检查在热路径上可通过 get_unchecked()(unsafe)跳过,但需形式化证明索引安全。unsafe 提速需同时证明不破坏安全性 invariant。
语法
// 预分配避免 realloc
let mut v = Vec::with_capacity(1000);
for i in 0..1000 { v.push(i); }
// 零拷贝字符串
use std::borrow::Cow;
fn process(s: Cow<str>) -> Cow<str> {
if s.len() > 100 { Cow::Owned(s[..100].to_string()) }
else { s }
}
// 内联提示
#[inline]
fn hot_path(x: i32) -> i32 { x * 2 }
// criterion 基准
use criterion::{criterion_group, criterion_main, Criterion};
fn bench_add(c: &mut Criterion) {
c.bench_function("add", |b| b.iter(|| add(2, 3)));
}
criterion_group!(benches, bench_add);
criterion_main!(benches);性能分析工具
| 工具 | 用途 |
|---|---|
cargo bench | 基准测试 |
cargo flamegraph | CPU 火焰图 |
cargo bloat | 二进制体积分析 |
perf record | Linux 性能采样 |
heaptrack | 堆内存追踪 |
cachegrind | 缓存模拟 |
实践
AI 自检
Vec::with_capacity(1000)比Vec::new()+ 1000 次push()快多少?从 realloc 次数解释。- PGO(Profile-Guided Optimization)如何工作?为何先运行 instrumented binary 再重新编译?