typestar

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

  1. Rayon decide si un segundo hilo vale la pena.
  2. La división recursiva es el encaje natural de join.
  3. Debajo de un umbral, haz el trabajo en serie.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 3 en Repartir trabajo; paso 6 de 9 en Paralelismo de datos con rayon.

← Anterior Siguiente →