本文是对 N倍性能提升!无痛Rust并行编程:Rayon库初体验[1]的学习与记录

有这样一段程序,计算1到1亿的连续数字之和
use std::i64;
fn main() {
let arr:Vec<i64> = (1..1_0000_0000).collect();
let result = sum_of_add(&arr);
println!("{}",result);
}
fn sum_of_add(input: &[i64]) -> i64 {
input.iter()
.map(|&i| i + i)
.sum()
}
添加部分代码,统计程序执行时间
use std::{i64, time::SystemTime};
fn main() {
let arr: Vec<i64> = (1..1_0000_0000).collect();
let time_a = SystemTime::now();
let result = sum_of_add(&arr);
println!("{}", result);
let time_b = SystemTime::now().duration_since(time_a);
println!("{:?}", time_b);
}
fn sum_of_add(input: &[i64]) -> i64 {
input.iter().map(|&i| i + i).sum()
}
执行 cargo run --release, 输出:
9999999900000000
Ok(67.672ms)
考虑使用Rayon。这是一个并行计算库,利用work-steal思想,让负载不高的线程,去分担其他线程的工作
在cargo.toml文件的dependence处新增 rayon = "1.8"
在代码中use rayon::prelude::*;
同时将 input.iter().map(|&i| i + i).sum() 改为 input.par_iter().map(|&i| i + i).sum()即可。 par即parallel
即
use std::{i64, time::SystemTime};
use rayon::prelude::*;
fn main() {
let arr: Vec<i64> = (1..1_0000_0000).collect();
let time_a = SystemTime::now();
let result = sum_of_add(&arr);
println!("{}", result);
let time_b = SystemTime::now().duration_since(time_a);
println!("{:?}", time_b);
}
fn sum_of_add(input: &[i64]) -> i64 {
input.par_iter().map(|&i| i + i).sum()
}
再次 cargo run --release
结果为:
9999999900000000
Ok(29.368ms)
提升了一倍有余。
如果不加 --release,相差更多。
Rust 的 Rayon 库提升程序性能的关键在于其并行数据处理能力。Rayon 是一个数据并行化库,它允许你轻松地将数据处理操作转换为并行执行的任务,以此来利用现代多核处理器的性能。以下是 Rayon 如何帮助提升程序性能的几个主要方面:
.iter())通过简单的更改(如更改为 .par_iter())变为并行迭代器,从而实现数据的并行处理。总的来说,Rayon 通过允许开发者以较低的努力实现有效的并行数据处理,帮助提升了程序在多核处理器上的性能。通过减少线程间的同步开销和更高效的工作分配,Rayon 确保了资源的最大化利用,从而提升整体的程序性能。
rayon相关代码解析[2]
更多阅读
【每周一库】- Rayon 数据并行计算库[3]
Rust Cookbook 中文版-数据并行[4] 和 Rust 烹饪书-并行任务[5] 只有翻译的区别
[1]
N倍性能提升!无痛Rust并行编程:Rayon库初体验: https://www.bilibili.com/video/BV1Rz4y1P791
[2]
rayon相关代码解析: https://github.com/cuishuang/explain-rust-source-code-by-chatgpt/tree/main/rayon
[3]
【每周一库】- Rayon 数据并行计算库: https://rustcc.cn/article?id=181e0a73-6742-42a9-b7a1-1c00bef436c2
[4]
Rust Cookbook 中文版-数据并行: https://rustwiki.org/zh-CN/rust-cookbook/concurrency/parallel.html
[5]
Rust 烹饪书-并行任务: https://llever.com/rust-cookbook-zh/concurrency/parallel.zh.html