性能优化与安全权衡

原理

性能优化的关键在于测量而非直觉。使用 criterion 基准测试 + flamegraph 分析热点。

缓存友好设计:连续内存访问(Vec > LinkedList)利用 CPU 预取器和缓存行(64B)。结构体字段排序影响内存对齐填充(#[repr(C)] 固定布局)。

内存分配优化:

  • Vec::with_capacity(n) 预分配避免 realloc
  • String::with_capacity(n) 同理
  • 小对象使用 smallvec / tinyvec(栈上内联存储)
  • 使用 bytes crate 实现零拷贝 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 flamegraphCPU 火焰图
cargo bloat二进制体积分析
perf recordLinux 性能采样
heaptrack堆内存追踪
cachegrind缓存模拟

实践

AI 自检

  1. Vec::with_capacity(1000)Vec::new() + 1000 次 push() 快多少?从 realloc 次数解释。
  2. PGO(Profile-Guided Optimization)如何工作?为何先运行 instrumented binary 再重新编译?