wasm performance regression in node 24
Personne n'a encore pris cette issue.
- Langage dominant
- JavaScript
- Étoiles
- 122k
- Forks
- 37.3k
- Merge moyen
- 4 j 2 h
- PR mergées (30 j)
- 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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez la régression avec lib/base64/Base64Decoder.wasm.js sous Node 22 et Node 24, en comparant les résultats de benchmark scalaire et SIMD liés dans l’issue. Lisez src/base64/Base64Decoder.wasm.ts et inspectez la sortie de --prof autour de la fonction WebAssembly, puis identifiez le changement dans Node ou V8 qui en est responsable. La tâche est terminée lorsque la régression est expliquée et qu’un fix approprié ou un rapport upstream est préparé.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, node.js, wasm
- Domaine
- backend, performance
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 43/100