“过早优化是万恶之源”的时代已经过去了
Rust 性能优化是关于让你的程序运行得更快,并使用更少的计算机资源。让我们探索一些容易理解的技术,它们可以帮助你编写更快的 Rust 代码。
1. 使用正确的数据结构
选择适合你数据的容器。
想象一下数据结构就像不同类型的盒子。有些盒子非常适合存储许多类似的物品(比如 Vec
),而有些盒子则非常适合将成对的物品放在一起(比如 HashMap
)。选择合适的“盒子”可以使你的程序运行得更快。
示例:对数字列表使用 Vec
fn main() {
let mut numbers = Vec::with_capacity(5); // 创建一个可以容纳 5 个数字的盒子
numbers.extend_from_slice(&[1, 2, 3, 4, 5]); // 将 5 个数字有效地放入盒子中
}
2. 利用零成本抽象
编写清晰的代码,其运行速度与复杂代码一样快。
Rust 允许你编写易于阅读的代码,计算机可以将其转换为非常快的指令。这就像拥有一个神奇的翻译器,它将你的简单指令转换为超高效的计划。
示例:使用迭代器(就像一个智能传送带,用于你的数据)
fn sum_of_squares(numbers: &[i32]) -> i32 {
numbers.iter().map(|&x| x * x).sum()
}
3. 最小化分配
避免不断地请求新的内存。
每当你的程序需要新的内存时,它就像去商店购物一样。如果你去得太频繁,你会浪费时间。相反,尝试尽可能地重复使用你拥有的内存,或者在可能的情况下借用内存(使用引用)。
使用引用(借用而不是复制)
fn process_data(data: &[u8]) -> usize {
// 在不进行复制的情况下处理数据
data.len()
}
4. 分析你的代码
使用工具来查找程序中的慢速部分。
分析就像使用秒表来计时比赛的不同部分一样。它可以帮助你找到代码中哪些部分运行时间过长,这样你就可以知道该改进哪些部分。
5. 使用发布模式构建
告诉 Rust 生成程序的最快速版本。
当你完成开发后,使用 --release
标志。这就像告诉 Rust 放手一搏,使用它所有的速度技巧。
cargo build --release
6. 利用 Rust 的所有权系统
使用 Rust 处理数据的规则来使你的程序运行得更快。
Rust 对你如何使用数据有特殊的规则。这些规则可能看起来很严格,但它们可以帮助你的程序快速运行,并避免常见的错误。
示例:移动语义(放弃数据而不是复制它)
fn main() {
let mut str = String::from("Bravo");
process_string(str); // 将 'str' 交给函数,不要复制
// 'str' 在这里不再可用
}
fn process_string(str: String) {
// 对 str 做一些事情
}
7. 明智地使用 unsafe
有时打破安全规则,但在这样做时要非常小心。
Rust 具有安全保障措施来防止错误。有时,你可以为了速度而绕过这些措施,但这就像在电动工具上禁用安全装置一样——有时很有用,但很危险。
8. 针对并行性进行优化
使你的程序同时执行许多事情。
如果你的计算机有多个核心(就像拥有多个工作者一样),你可以在它们之间分配你的任务以更快地完成。
示例:并行处理(就像让多个工作者汇总数字一样)
use rayon::prelude::*;
fn parallel_sum(numbers: &[i32]) -> i32 {
numbers.par_iter().sum()
}
9. 使用合适的类型
为你的数据选择正确的变量类型。
为你的数据选择正确的类型就像为工作选择合适的工具一样。对于正数使用 u32
就好像当你需要锤子时使用锤子,而不是螺丝刀一样。
10. 基准测试和迭代
衡量你的程序运行速度,然后尝试改进它。
使用工具来精确地计时你的程序。然后,进行更改并再次测量,以查看它是否变快了。这就像调整汽车引擎一样——测量、调整和重复。
示例:使用 Criterion 进行精确计时
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn fibonacci(n: u64) -> u64 {
match n {
0 => 1,
1 => 1,
n => fibonacci(n-1) + fibonacci(n-2),
}
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
参考资料
https://rust-lang-nursery.github.io/rust-cookbook/ https://www.reddit.com/r/rust/comments/qy2i9o/resources_for_rust_best_practices/ https://rust-unofficial.github.io/patterns/ https://doc.rust-lang.org/stable/book/ch03-00-common-programming-concepts.html
结论
使 Rust 程序运行得更快是关于使用合适的工具和技术。通过选择良好的数据结构、避免不必要的工作以及使用 Rust 的特殊功能,你可以编写既易于理解又非常快的程序。请记住,要测量程序的速度,并不断尝试一点一点地改进它。