首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用Rust Rayon库提升程序运行速度

使用Rust Rayon库提升程序运行速度

作者头像
fliter
发布2023-12-13 13:17:34
发布2023-12-13 13:17:34
6290
举报
文章被收录于专栏:旅途散记旅途散记

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

有这样一段程序,计算1到1亿的连续数字之和

代码语言:javascript
复制
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()

}

添加部分代码,统计程序执行时间

代码语言:javascript
复制
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, 输出:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

结果为:

代码语言:javascript
复制
9999999900000000
Ok(29.368ms)

提升了一倍有余。

如果不加 --release,相差更多。

Rust 的 Rayon 库提升程序性能的关键在于其并行数据处理能力。Rayon 是一个数据并行化库,它允许你轻松地将数据处理操作转换为并行执行的任务,以此来利用现代多核处理器的性能。以下是 Rayon 如何帮助提升程序性能的几个主要方面:

  1. 简化并行化:Rayon 提供了高级的抽象,允许开发者以最少的代码改动实现并行处理。例如,它可以将常规的迭代器链(如 .iter())通过简单的更改(如更改为 .par_iter())变为并行迭代器,从而实现数据的并行处理。
  2. 工作窃取调度:Rayon 使用工作窃取调度算法来有效地管理并行任务。在这种调度方式中,每个线程都有自己的任务队列。当一个线程完成了它的所有任务而其他线程还在忙时,它可以“窃取”其他线程的任务来继续工作,从而保持所有的核心都在忙碌并减少闲置时间。
  3. 负载均衡:Rayon 能够动态地将工作负载分配给多个线程,从而在不同的线程间实现负载均衡。这意味着即使是不均匀分布的任务,Rayon 也能有效地处理,确保所有处理器核心都有效利用。
  4. 减少数据竞争和同步开销:Rayon 设计了高效的数据分割和任务划分机制,这有助于减少线程间的数据竞争和同步开销。它尽可能地使各个线程独立工作,减少了对锁或其他同步机制的依赖。
  5. 易于集成和使用:Rayon 非常容易集成到现有的 Rust 项目中。它与 Rust 的标准库良好兼容,并且由于 Rust 语言本身的安全性和并发模型,使用 Rayon 实现并行化时可以减少数据竞争和并发错误的风险。

总的来说,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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 旅途散记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档