Software··2 min de lectura

Wasmi 2.0: el intérprete de WebAssembly duplica su velocidad

La nueva versión del intérprete de WebAssembly Wasmi promete ser 2,2 veces más rápida que su predecesora, gracias a una revisión profunda de su motor de ejecución.

Wasmi, el intérprete de WebAssembly escrito en Rust, ha lanzado su versión 2.0 tras ocho meses de trabajo. El objetivo era claro: mejorar el rendimiento de ejecución, y lo han conseguido. Según las pruebas internas, Wasmi 2.0 es 2,2 veces más rápido que la versión 1.0 en la suite de benchmarks del propio proyecto, medidas en un Apple M2 Pro.

El proyecto, que se utiliza en sistemas embebidos, plugins, contratos inteligentes y consolas de juegos ligeras, está patrocinado por la Stellar Development Foundation desde octubre de 2024. Sin ese apoyo, dicen, no habrían llegado hasta aquí.

¿Cómo lo han logrado?

El cambio más importante es la introducción de cuatro modos de despacho de instrucciones, cada uno con sus ventajas. El modo más rápido, llamado "direct-threaded code", incrusta punteros a función directamente en el IR interno y usa tail calls para saltar de un manejador a otro. Es el mismo enfoque que ya usaban Wasm3 y Stitch. También hay modos más conservadores para plataformas sin soporte de tail calls.

Además, Wasmi 2.0 añade tres registros acumuladores (ireg, freg32 y freg64) que permiten mantener valores intermedios en registros del hardware en lugar de en la pila. Esto simplifica las instrucciones y reduce el trabajo de carga y almacenamiento.

El resultado es un código ensamblador muy limpio en aarch64, como se puede ver en el post original. La instrucción i64_add se convierte en apenas cuatro instrucciones de máquina.

Limitaciones y próximos pasos

Los benchmarks comparan Wasmi 2.0 con otros intérpretes portables como Wasm3, WAMR o Wasmtime Pulley. En media geométrica, Wasmi 2.0 se sitúa entre los más rápidos, aunque no dan cifras exactas de todos los enfrentamientos.

El equipo reconoce que aún hay margen de mejora. Por ejemplo, el uso de registros acumuladores requiere instrucciones de copia adicionales en ciertos casos, y la convención de llamada sysv64 limita el número de argumentos que se pueden pasar en registros de propósito general. Para resolver esto, han convertido uno de los argumentos (el puntero a instancia) en un valor de coma flotante, lo que parece funcionar bien según sus pruebas.

De cara al futuro, mencionan que la ABI preserve_none podría mejorar aún más las cosas cuando se estabilice.

Wasmi 2.0 ya está disponible en crates.io, con una guía de migración para los que vengan de la 1.0. Si el proyecto sigue este ritmo, no sería raro verlo asumido por más proyectos que necesitan un intérprete de Wasm rápido y ligero.

##Relacionado