Polars合集 点此阅读
Rust 性能优化 点此阅读
Rust 新手写出 Python 速度的 7 个最蠢错误
我刚学 Rust 那会儿,用 release 模式跑了个字符串处理脚本,比 Python 还慢 20%。
当时心态崩了:Rust 不是号称“比 C 还快”吗?怎么我写出来跟 Python 差不多?
后来用火焰图 + criterion 反复虐自己,才发现新手最容易犯的 7 个“蠢到家”的错误,每犯一个,性能就向 Python 靠拢一步。
这篇文章把我的血泪教训全部抖出来,每条都附:
看完保证你下次写代码时,能主动避开这些坑,起码提速 2–5 倍。
最蠢错误 1:遇到借用问题就 clone 一切(性能第一杀手)
坏代码(我最初的写法):
fn process(items: Vec<Item>) {
for item in items {
let owned = item.clone();
do_work(owned);
}
}
结果:Vec 如果 Item 里有 String/Vec,clone = 深拷贝,慢到起飞。
正确:借用 or Arc
fn process(items: &[Item]) { ... } // 最佳
// 或
let items = Arc::new(items); Arc::clone(&items);
血泪提升:从 1200ms → 280ms(提速 4.3 倍)。
最蠢错误 2:String + format! 当锤子用,到处砸
坏代码:
let key = "user:".to_string() + &id.to_string();
或
format!("user:{}:score", id)
火焰图全是 String::from + push_str。
正确:write! + 复用 buffer 或 SmolStr
let mut key = String::with_capacity(32);
write!(&mut key, "user:{}:score", id).unwrap();
提升:字符串密集任务提速 3–6 倍。
最蠢错误 3:Vec push 不管容量,死命 realloc
我以前的“优雅”代码:
let mut lines = vec![];
while let Some(line) = reader.next() {
lines.push(line);
}
优化后加一行:
let mut lines = Vec::with_capacity(4096);
提升:1M 行文件解析,从 4.2s → 1.1s(3.8 倍)。
最蠢错误 4:for 循环 + clone,而不是迭代器链
坏代码:
let mut sum = 0;
for i in 0..data.len() {
let val = data[i].clone();
sum += val;
}
正确:直接迭代
let sum: i64 = data.iter().map(|x| x.value).sum();
提升:避免无谓 clone + 边界检查优化,提速 50%+。
最蠢错误 5:HashMap 用 String key,到处 to_string()
坏代码:
cache.insert(user_id.to_string(), profile);
正确:
use smol_str::SmolStr;
// 推荐:零分配小字符串 key
let mut cache: HashMap<SmolStr, Profile> = HashMap::new();
cache.insert(user_id.into(), profile); // SmolStr::from(&str) 或 from(String) 零拷贝
// 或者如果你坚持用 String,但只分配一次:
cache.insert(user_id, profile); // 如果 user_id 已经是 String,直接 move
提升:缓存命中场景,QPS 从 800 → 3200+。
最蠢错误 6:小数据还 Box / Vec(栈上更快)
坏代码:
let point = Box::new(Point { x: 1, y: 2 });
正确:直接用
let point = Point { x: 1, y: 2 };
小结构体栈分配快得多,Box 引入指针间接 + 分配。
提升:小对象密集循环,提速 2–4 倍。
最蠢错误 7:release 配置没开优化,panic = unwind
很多人 Cargo.toml 啥都不写,默认 codegen-units=16 + panic=unwind。
正确配置:
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"
提升:二进制跑分提升 15%–50%(视项目而定)。
我的血泪总结一句话:
Rust 慢不是语言问题,是你写出了“带 GC 思维”的 Rust。
行动清单:
- 1. 跑一次
cargo flamegraph,截图最宽平台
我全踩过的坑,你不必再踩。Rust 真的可以很快,就差你把这些蠢错误干掉。
Polars合集 点此阅读
Rust 性能优化 点此阅读
(全文完)