Skip to content

SIMD and wasm‑opt in WebAssembly builds: November 2026

Reference machine
Apple M4 Pro (arm64) · macOS 26.5.2
Browsers
Chrome 156, Firefox 151 and Safari 26
Samples
15 rounds per row, two captures

Only the Apple M4 Pro (arm64) has been measured, not x86-64.

Measure on this machine

1. Main points

  • On arm64, simd128 cut zlib-rs deflate L1's time by up to 18.4%, but slowed zstd decode by up to 7.6% in Firefox (Figure 1).
  • Skipping wasm-opt cut brotli encode's time by up to 18.5% in Chrome and Safari, but slowed 3 workloads by up to 9.6% (Figure 2).
  • wasm-opt -Os shrank all 5 modules by up to 33.1 kB after compression (Figure 3).

2. SIMD and speed

Figure 1. simd128 cut zlib‑rs deflate L1's time by 6.3%–18.4% on 2 of 3 inputs, in all 3 browsers

simd128 build's time ÷ the scalar build's in the same round, both at wasm-opt -Os; 15 rounds.

  • Claimed in both captures
  • Not claimed
  • 95% CI
  • Min–max
  • ±3% threshold

Arrow keys move between points; Enter pins one so its values stay shown; Escape clears.

;; zlib-rs compare256, wasm32 + simd128, per 16 bytes
(i8x16.eq a b)        ;; 0xff where bytes match
(i8x16.bitmask ...)   ;; one bit per byte

;; x86-64 (V8): one instruction each
pcmpeqb   xmm0, xmm1
pmovmskb  eax, xmm0

;; arm64 (V8): no single equivalent for i8x16.bitmask;
;; V8 emits a multi-instruction sequence (which one
;; depends on the CPU's features)
Source: zlib-rs 0.6.8 and V8 at commit 63481c19 (Measurement notes).

3. wasm-opt and speed

Figure 2. Skipping wasm‑opt cut brotli encode's time by 4.3%–18.5% on all 3 inputs, in Chrome and Safari

Scalar build without wasm-opt: its time ÷ the shipped build's (wasm-opt -Os) in the same round; 15 rounds.

  • Claimed in both captures
  • Not claimed
  • 95% CI
  • Min–max
  • ±3% threshold

Arrow keys move between points; Enter pins one so its values stay shown; Escape clears.

4. wasm-opt, SIMD and download size

Figure 3. wasm‑opt ‑Os shrank all 5 modules; simd128 grew all 5

Change in brotli-compressed bytes per module; exact and the same in every browser.

Arrow keys move between points; Enter pins one so its values stay shown; Escape clears.

5. The A/A control

Figure 4. A/A control: within ±2.2% in Chrome and Firefox; failed for the zstd decoder in Safari

Time of a second, byte-identical instance of the shipped build ÷ the first's, pooling each workload's inputs and both captures. Where it fails, nothing is claimed for that workload in that browser.

  • Control failed
  • Passed
  • 95% CI
  • Min–max
  • ±3% threshold

Arrow keys move between points; Enter pins one so its values stay shown; Escape clears.

6. All configurations

Browser and machine shown in Table 1
Table 1. Each build's time ÷ the shipped build's in the same round (Chrome 156, capture 1): median of 15 rounds and 95% CI. Bold clears the claim rule in this capture.
Workload · inputShipped, per runscalar
no wasm-opt
scalar
-O3
simd128
no wasm-opt
simd128
-Os
simd128
-O3
A/A
zstd decodedickens10.1 ms1.0371.02–1.041.0611.05–1.071.0381.02–1.051.0091.00–1.031.0111.01–1.020.9990.99–1.01
 x-ray11.0 ms1.0241.01–1.031.0040.99–1.011.0040.99–1.010.9960.99–1.011.0030.99–1.010.9940.99–1.00
 samba13.6 ms1.0221.00–1.030.9880.98–1.010.9960.98–1.010.9620.95–0.970.9860.97–0.990.9940.99–1.01
zlib-rs inflatedickens15.9 ms1.0141.00–1.031.0030.99–1.020.9590.95–0.970.9550.95–0.960.9500.95–0.971.0010.99–1.01
 x-ray24.1 ms1.0171.01–1.020.9991.00–1.001.0201.02–1.031.0121.00–1.021.0121.00–1.021.0051.00–1.01
 samba24.7 ms1.0171.00–1.021.0081.00–1.020.9240.92–0.930.9130.91–0.920.9160.91–0.931.0031.00–1.01
zlib-rs deflate L1dickens50.6 ms1.0091.00–1.021.0070.99–1.010.8630.85–0.870.8590.85–0.870.8620.85–0.871.0060.99–1.02
 x-ray57.6 ms0.9740.94–0.990.9740.95–1.010.9730.95–0.990.9600.93–0.980.9670.94–0.981.0000.99–1.01
 samba68.3 ms0.9930.99–1.001.0040.99–1.010.8210.81–0.830.8160.81–0.840.8250.81–0.830.9970.99–1.01
zlib-rs deflate L6dickens151 ms1.0131.01–1.020.9950.99–1.000.9940.99–1.000.9790.98–0.990.9820.98–0.980.9991.00–1.00
 x-ray126 ms1.0961.09–1.100.9990.99–1.001.0611.06–1.070.9720.97–0.980.9730.96–0.980.9980.99–1.00
 samba194 ms1.0251.02–1.031.0011.00–1.000.9740.97–0.980.9480.95–0.950.9530.95–0.961.0031.00–1.01
zlib-rs deflate L9dickens294 ms0.9950.99–1.000.9930.99–1.000.9760.97–0.980.9820.98–0.980.9780.98–0.981.0021.00–1.01
 x-ray194 ms0.9790.98–0.980.9790.98–0.980.9580.95–0.960.9900.99–0.990.9720.97–0.981.0001.00–1.00
 samba392 ms0.9890.99–0.990.9880.99–0.990.9530.95–0.960.9630.96–0.970.9600.96–0.961.0041.00–1.01
lz4_flex decodedickens4.65 ms0.9860.98–0.990.9770.97–0.980.9870.98–0.990.9810.98–0.990.9830.97–0.981.0030.99–1.01
 x-ray2.11 ms0.9850.97–1.000.9760.96–0.980.9840.97–1.000.9870.98–1.000.9660.95–0.981.0041.00–1.01
 samba7.57 ms0.9870.98–0.990.9650.96–0.970.9770.97–0.980.9810.97–0.980.9520.95–0.971.0010.99–1.01
brotli encodedickens149 ms0.9570.95–0.960.9900.99–1.000.9550.95–0.960.9860.98–0.990.9870.98–0.991.0000.99–1.00
 x-ray149 ms0.9300.93–0.930.9880.99–0.990.9210.92–0.920.9700.97–0.970.9680.96–0.980.9991.00–1.00
 samba172 ms0.9490.94–0.950.9860.98–0.990.9410.94–0.940.9860.98–0.990.9840.98–0.990.9990.99–1.00
XML (dlmalloc)xml46.8 ms0.9970.99–1.001.0011.00–1.010.9970.99–1.000.9980.99–1.000.9970.99–1.001.0071.00–1.01
Table 2. Brotli bytes of each build; under each, raw · gzip. Bold is the shipped build; SIMD instructions are a static count.
Module · SIMDNo wasm-optwasm-opt -Oswasm-opt -O3SIMD instructions
none · -Os · -O3
zstd decoderscalar43,227145,543 · 53,93241,465137,334 · 51,17941,265137,379 · 51,1310 · 0 · 0
simd12844,653148,212 · 55,85942,612140,050 · 52,52442,496140,173 · 52,634658 · 664 · 666
zlib-rsscalar47,980130,845 · 57,48147,217123,119 · 56,41547,124123,255 · 56,3820 · 0 · 0
simd12848,466130,831 · 57,65547,670123,194 · 56,42747,474123,537 · 56,376523 · 533 · 547
lz4_flexscalar23,31066,313 · 27,51222,40459,668 · 26,48722,42360,129 · 26,4960 · 0 · 0
simd12823,62766,978 · 27,96022,56260,601 · 26,62422,54061,056 · 26,716184 · 183 · 183
brotli encoderscalar378,6541,007,336 · 518,206345,521945,132 · 527,136345,923945,156 · 527,0800 · 0 · 0
simd128379,7461,008,484 · 518,301347,733949,621 · 526,455394,572950,835 · 527,2902,180 · 2,377 · 2,387
XML processingscalar16,95848,763 · 20,56016,04445,905 · 19,31515,95645,984 · 19,2820 · 0 · 0
simd12817,03048,614 · 20,56816,05445,923 · 19,27216,02246,000 · 19,259104 · 115 · 115
Measurement notes
Conditions
Clock
Method
Workloads
Builds
Pairing
Sizes
Mechanism
Recaptured
Build
Libraries
Commit
Artifacts
Corpus

7. Measure on this machine

Input
Inputs for the codec workloads

6 rows to run.

Configurations
Workloads to run
Samples
Export after a run: CSV, JSON, Markdown