#thread #performance #parallel #join

nightly rayoff

rayon,但它是map-reduce

2个版本

0.0.2 2022年1月17日
0.0.1 2022年1月9日

#940并发

MIT/Apache

37KB
793

rayon 类似,rayoff 为迭代器提供了引入并行性的额外功能。然而,rayoff 使用简单的map-reduce策略,而不是使用工作窃取策略来确保线程不会因工作不足而饿死。

  1. 将迭代器分成大小大致相等的块(有关实现细节,请参阅此处)。
  2. 将每个块映射到自己的线程。
  3. 对每个线程的计算结果进行汇总。

在几乎所有情况下,rayon 是更好的选择。但是,如果您的计算不会从工作窃取中受益,那么rayoff 可能 会提供更好的性能。免责声明:rayoff 需要 nightly 编译器(截至本文写作时为 rustc 1.60.0)并且内部使用 unsafe 代码。请自行承担风险!

示例

use rayoff::*;

fn check(candidate: &[u8]) -> bool {
    candidate == b"orange8"
}

let wordlist = ["apple", "orange", "pear", "banana"];
let cracked_password = wordlist.divvy_cpus().find_map_any(|&word| {
    let mut buf = [0u8; 8];
    let len = word.len();
    buf[..len].copy_from_slice(word.as_bytes());
    for i in b'0'..=b'9' {
        buf[len] = i;
        let password = &buf[..len + 1];
        if check(password) {
            return Some(password.to_vec());
        }
    }
    None
});

assert_eq!(cracked_password.unwrap(), b"orange8");

许可证

rayoff 在 MIT 和 Apache 2.0 许可证下双授权(有关详细信息,请参阅 LICENSE-MITLICENSE-APACHE)。

无运行时依赖