rayon::join en Rust
join corre dos closures que pueden ir en paralelo — la base de divide y vencerás.
fn sum_slice(values: &[u64]) -> u64 {
if values.len() <= 1_000 {
return values.iter().sum();
}
let middle = values.len() / 2;
let (left, right) = values.split_at(middle);
let (a, b) = rayon::join(|| sum_slice(left), || sum_slice(right));
a + b
}
fn main() {
let values: Vec<u64> = (1..=100_000).collect();
let total = sum_slice(&values);
println!("{total}");
assert_eq!(total, values.iter().sum::<u64>());
}
Cómo funciona
- Rayon decide si un segundo hilo vale la pena.
- La división recursiva es el encaje natural de
join. - Debajo de un umbral, haz el trabajo en serie.
Palabras clave y builtins usados aquí
Vecfnifletreturnu64
El intento, en números
- Líneas
- 16
- Caracteres a escribir
- 408
- Tokens
- 150
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 82 segundos.
Paso 1 de 3 en Repartir trabajo; paso 6 de 9 en Paralelismo de datos con rayon.