Escribí un código muy rudimentario para calcular si un número es primo en Rust (compilado en WASM) y en JavaScript para comparar el rendimiento aritmético.
Esperaba que Rust/WASM acabara con JavaScript. En todos los demás puntos de referencia aritméticos que he hecho, Rust/WASM parece tener la ventaja sobre JavaScript o al menos igualarlo. Sin embargo, en esta prueba, JavaScript parece superar en gran medida a WASM y realmente no tengo una explicación de por qué.
Código de óxido:
pub fn calculate_is_prime(number: u64) -> bool { if number == 1 { return false; } if number == 2 { return true; } for i in 2..number { if number % i == 0 { return false; } } return true; } #[wasm_bindgen] pub fn bench_rs(max: u64) -> u64 { (1..=max).map(|n| calculate_is_prime_rs(n) as u64).sum() }Código JavaScript:
function calculateIsPrime(number) { if (number === 1) { return false; } if (number === 2) { return true; } for (let i = 2; i < number; i++) { if (number % i === 0) { return false; } } return true; } function bench_js(max) { let tot = 0; for (let n = 1; n <= max; n++) { tot += calculateIsPrime(n); } return tot; } let max = 200000; console.log(`Amount of primes under ${max} is ${bench_js(max)}`);Proyecto de muestra básico: https://github.com/Mcluky/Stack-Overflow-Rust-Wasm-Performance-Example
Cosas que ya he comprobado/hecho:
--release mientras construía el código de óxido.while en lugar de for-in en la versión de Rust en caso de que no estuviera tan optimizado como pensaría.No puedo reproducir sus resultados en un Ryzen Threadripper 2950x en Windows 10. Agregué las siguientes funciones:
#[wasm_bindgen] pub fn bench_rs(max: u64) -> u64 { (1..=max).map(|n| calculate_is_prime_rs(n) as u64).sum() } function bench_js(max) { let tot = 0; for (let n = 1; n <= max; n++) { tot += calculateIsPrime(n); } return tot; } Luego compilé con wasm-pack build --release --target web y evalué en Google Chrome:
> console.time("rs"); console.log(bench_rs(BigInt(200000))); console.timeEnd("rs"); 17984n rs: 6015.033935546875 ms > console.time("js"); console.log(bench_js(200000)); console.timeEnd("js"); 17984 js: 6017.426025390625 msY en Firefox:
> console.time("rs"); console.log(bench_rs(BigInt(200000))); console.timeEnd("rs"); 17984n rs: 6076ms - timer ended > console.time("js"); console.log(bench_js(200000)); console.timeEnd("js"); 17984 js: 6074ms - timer ended