nodejs / nodejs/node

wasm performance regression in node 24

Open
#61,695 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

performance v8 engine
Dominant language
JavaScript
Stars
122k
Forks
37.3k
Avg merge
4d 2h
Merged PRs (30d)
283

Description

In xterm.js we use a custom base64 wasm decoder [^1] to decode image data. During a recent package upgrade we saw a major performance drop of the decoder when switching from node 22 to node 24 (SIMD variant):

jerch@linpad:~/xterm-wasm-parts$ nvm use 22
Now using node v22.22.0 (npm v10.9.4)
jerch@linpad:~/xterm-wasm-parts$ node lib/base64/Base64Decoder.wasm.js
duration: 220 ms, rate: 4767 MB/s
duration: 199 ms, rate: 5265 MB/s
duration: 234 ms, rate: 4472 MB/s
jerch@linpad:~/xterm-wasm-parts$ nvm use 24
Now using node v24.13.0 (npm v11.6.2)
jerch@linpad:~/xterm-wasm-parts$ node lib/base64/Base64Decoder.wasm.js
duration: 508 ms, rate: 2064 MB/s
duration: 493 ms, rate: 2126 MB/s
duration: 522 ms, rate: 2008 MB/s

More numbers can be found in the benchmark CI results:

  • Node 22 scalar: ~1900 MB/s - here
  • Node 24 scalar: ~1700 MB/s - here
  • Node 22 SIMD: ~4200 MB/s - here
  • Node 24 SIMD: ~1800 MB/s - here

Is this a know issue? (did not find any other similar report here or for v8)

The issue is somewhat serious, as the effect is quite high for SIMD code (numbers above are for the SIMD variant of the decoder), for scalar code the effect is less pronounced but still there.

Sadly I don't know where to start looking, in the --prof file it simply states, that the wasm function took much more cycles.

[^1]: code of the base64 decoder : https://github.com/jerch/xterm-wasm-parts/blob/master/src/base64/Base64Decoder.wasm.ts

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the regression with lib/base64/Base64Decoder.wasm.js under Node 22 and Node 24, comparing the scalar and SIMD benchmark results linked in the issue. Read src/base64/Base64Decoder.wasm.ts and inspect the --prof output around the WebAssembly function, then identify the Node or V8 change responsible. Done means the regression is explained and an appropriate fix or upstream report is prepared.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, node.js, wasm
Domain
backend, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
43/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.