nodejs / nodejs/node

wasm performance regression in node 24

Aperta
#61,695 6 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

performance v8 engine
Lingua principale
JavaScript
Stelle
122k
Fork
37.3k
Merge medio
4g 2h
PR unite (30g)
283

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Riproduci la regressione con lib/base64/Base64Decoder.wasm.js su Node 22 e Node 24, confrontando i risultati dei benchmark scalare e SIMD collegati nell’issue. Leggi src/base64/Base64Decoder.wasm.ts e ispeziona l’output di --prof intorno alla funzione WebAssembly, quindi identifica la modifica in Node o V8 responsabile. Il lavoro è completato quando la regressione è spiegata e viene preparato un fix appropriato o un report upstream.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript, node.js, wasm
Ambito
backend, performance
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
43/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.