¿Con qué rapidez ejecuta tu navegador WebAssembly real? Cinco módulos .wasm —aritmética de enteros, hash a nivel de bits, una simulación en coma flotante, una ordenación en memoria y un cálculo de fractal—, cada uno compilado y ejecutado con WebAssembly.instantiate, con la misma cantidad de trabajo para todos los visitantes, uno tras otro. Cuanto menor el tiempo total, mejor.
Tu navegador no admite WebAssembly, que este benchmark necesita. Prueba con una versión reciente de Chrome, Edge, Firefox o Safari.
WebAssembly (a menudo abreviado «Wasm») es un formato binario de instrucciones de bajo nivel diseñado para ejecutarse dentro de un navegador a una velocidad cercana a la nativa. Lo desarrollaron conjuntamente Google, Mozilla, Apple y Microsoft y se lanzó a la vez en Chrome, Firefox, Safari y Edge en 2017, tras un par de años de diseño público en el W3C. A diferencia de JavaScript, que el navegador tiene que analizar e interpretar o compilar sobre la marcha desde texto fuente, WebAssembly llega como bytecode compacto y precompilado que un motor puede validar y convertir en código máquina casi de inmediato, sin necesidad de calentar un intérprete.
Su mayor caso de uso es llevar a la web código nativo existente —escrito en C, C++, Rust o Go— sin reescribirlo en JavaScript. En la práctica se ve en software de escritorio pesado que corre en una pestaña normal del navegador: los editores web de Figma y Photoshop, el visor web de AutoCAD y Google Earth se apoyan en WebAssembly para sus motores centrales. Los estudios de videojuegos lo usan para publicar proyectos de Unity y Unreal como versiones jugables en el navegador, los emuladores de consolas retro lo usan para ejecutar el código del hardware original a plena velocidad, y es una opción habitual para códecs de audio y vídeo, filtros de imagen, bibliotecas criptográficas, compresión de datos en el navegador y cálculo científico o de CAD: allí donde JavaScript solo es demasiado lento pero pedir a alguien que instale una aplicación nativa no es realista.
Este benchmark construye a mano cinco módulos WebAssembly reales, codificando directamente en el JavaScript de esta página las secciones de tipos, funciones, memoria, exportaciones y código del formato binario y sus códigos de operación, sin ningún compilador ni biblioteca externos, y luego ejecuta cada uno con WebAssembly.instantiate exactamente como lo haría cualquier aplicación WebAssembly. Las cinco cargas muestrean el tipo de trabajo que suele hacer WebAssembly: un bucle de aritmética de enteros pura, una pasada de hash y mezcla a nivel de bits, un cálculo iterativo en coma flotante, una ordenación de un array en la memoria lineal propia de WebAssembly y un cálculo de tiempo de escape de un fractal, representativo del trabajo de imagen a nivel de píxel. Cada carga ejecuta un número fijo de operaciones, así que la entrada es idéntica para todos los visitantes. La puntuación es el tiempo real combinado de compilar y ejecutar las cinco, en milisegundos, medido con performance.now(): cuanto menor, mejor.