Estoy haciendo algunas pruebas con Wasm generado por Rust (wasm_bindgen). Lo que me deslumbra es que la implementación de JavaScript parece ser mucho más rápida que la implementación de Rust.
El programa está creando n elementos de un dictado/objeto/mapa y empujándolos a una matriz.
La implementación de JavaScript es muy fácil:
const createJSObjects = (amount: number) => { const arr: Array<{ index: number }> = [] for (let i = 0; i < amount; i++) { arr.push({ index: i }) } return arr }Suficientemente fácil. La implementación de Rust es similar:
#[wasm_bindgen] pub fn create_rust_objects(amount: usize) -> JsValue { let mut arr: Vec<Obj> = vec![]; arr.reserve(amount); for i in 0..amount { let itm = Obj { index: i }; arr.push(itm); } JsValue::from_serde(&arr).unwrap() }También probé con un vector de hashmaps:
let mut field = HashMap::new(); field.insert("index", i); arr.push(field);Ambos son igualmente "lentos".
Estoy importando el binario Wasm con los archivos js y d.ts generados que vienen con wasm-build.
El JavaScript es al menos dos veces más rápido que el código oxidado. ¿Por qué es esto? ¿Estoy haciendo algo mal con la implementación? La implementación se configura de acuerdo con los documentos de MDN.
Puse todo el código en un proyecto React - https://github.com/Devalo/rust-react-wasm-test
La respuesta es que probablemente no estés haciendo nada malo. Esencialmente, WASM tiene el potencial de ser más rápido, pero no siempre lo será.
Realmente me gustó esta lectura rápida de Winston Chen en la que ejecutan pruebas de rendimiento que comparan el ensamblaje web con Vanilla JS.
Si está interesado en una conversación más profunda, esta charla de Surma en Google I/O '19 es muy informativa. Del vídeo:
Tanto JavaScript como Web Assembly tienen el mismo rendimiento máximo. Son igual de rápidos. Pero es mucho más fácil mantenerse en el camino rápido con Web Assembly que con JavaScript.