Насколько быстро ваш браузер выполняет настоящий WebAssembly? Пять .wasm-модулей — целочисленная арифметика, битовое хеширование, симуляция с плавающей точкой, сортировка в памяти и вычисление фрактала — каждый скомпилирован и выполнен через WebAssembly.instantiate, одинаковый объём работы для всех, один модуль за другим. Меньше суммарное время — лучше.
Ваш браузер не поддерживает WebAssembly, который требуется для этого теста. Попробуйте свежую версию Chrome, Edge, Firefox или Safari.
WebAssembly (часто сокращают до «Wasm») — низкоуровневый бинарный формат инструкций, созданный для выполнения в браузере со скоростью, близкой к нативной. Его совместно разработали Google, Mozilla, Apple и Microsoft, и он одновременно появился в Chrome, Firefox, Safari и Edge в 2017 году, после пары лет открытой работы над стандартом под эгидой W3C. В отличие от JavaScript, который браузеру приходится разбирать и интерпретировать или компилировать «на лету» из исходного текста, WebAssembly поставляется в виде компактного, заранее скомпилированного байт-кода, который движок может проверить и превратить в машинный код почти мгновенно, без разогрева интерпретатора.
Главное применение WebAssembly — перенос существующего нативного кода на C, C++, Rust или Go в браузер без переписывания на JavaScript. На практике это тяжёлые десктопные программы, работающие прямо во вкладке браузера: веб-редакторы Figma и Photoshop, веб-просмотрщик AutoCAD и Google Earth опираются на WebAssembly в своих движках. Игровые студии используют его, чтобы публиковать проекты на Unity и Unreal в виде играбельных веб-сборок, эмуляторы старых консолей — чтобы выполнять код оригинального железа на полной скорости, а также это частый выбор для аудио- и видеокодеков, фильтров изображений, криптографических библиотек, сжатия данных в браузере и научных или инженерных (CAD) вычислений — везде, где одного JavaScript не хватает по скорости, а предлагать установить нативное приложение непрактично.
Этот тест вручную собирает пять настоящих модулей WebAssembly, кодируя секции типов, функций, памяти, экспорта и кода бинарного формата вместе с их опкодами инструкций прямо в JavaScript этой страницы, без какого-либо внешнего компилятора или библиотеки — а затем запускает каждый через WebAssembly.instantiate точно так же, как это делает любое приложение на WebAssembly. Пять задач отражают типичную для WebAssembly работу: цикл целочисленной арифметики, проход битового хеширования/перемешивания, итеративное вычисление с плавающей точкой, сортировку массива прямо в линейной памяти WebAssembly и вычисление времени выхода фрактала — задача, характерная для попиксельной обработки изображений. Каждая задача выполняет фиксированное число операций, так что вход одинаков у всех посетителей. Результат — суммарное время компиляции и выполнения всех пяти в миллисекундах, замеренное через performance.now() — меньше значит лучше.