2个版本
0.0.2 | 2022年1月17日 |
---|---|
0.0.1 | 2022年1月9日 |
#940 在 并发
37KB
793 行
与 rayon 类似,rayoff
为迭代器提供了引入并行性的额外功能。然而,rayoff
使用简单的map-reduce策略,而不是使用工作窃取策略来确保线程不会因工作不足而饿死。
- 将迭代器分成大小大致相等的块(有关实现细节,请参阅此处)。
- 将每个块映射到自己的线程。
- 对每个线程的计算结果进行汇总。
在几乎所有情况下,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-MIT 和 LICENSE-APACHE)。