Performance benchmarks

How js2wasm-compiled WebAssembly performs against plain JavaScript across a set of representative workloads — runtime speed per benchmark, plus how those numbers have trended across benchmark runs over time.

← Back to home
Dynamic code evaluation

Bytecode interpreter vs QuickJS vs AOT

The same dynamically assembled function sums i % 7 over 10,000 iterations. Every measured sample returned the expected value, 29,994. Lower is better; factors are relative to the fastest lane in each panel.

Includes engine loading and the first parse or compilation. Prebuilt provider artifacts remain cached.

This is actual repeated eval(source) : compilation happens again for every measured call.

Models a cached function or tier-up: only execution of the prepared result is timed.

Two different winners. QuickJS-NG has the lowest latency for cold and repeated eval. The AOT side module is fastest once its compiled result is reused; its displayed lane is unoptimized so the deterministic loop is not folded away by wasm-opt .
Methodology and provenance

Measured 12 August 2026 on an Apple M4 with Node 24.4.1. Cold results are medians of 7 interleaved fresh processes. Hot eval uses 3 warmups and 9 measured calls. Prepared execution uses 5 warmups and 15 calibrated measured batches. Filesystem caches were not flushed. All three lanes run under the same Node host; the AOT proof of concept uses the Node-hosted js2wasm compiler. See the raw samples and artifact hashes , the interpreter and QuickJS revision , and the AOT side-module revision .

Loading benchmark data…