Introduction
Nous avons réécrit notre parseur WASM en TypeScript, ce qui a entraîné une amélioration de la vitesse de 3 fois. Cette décision a été prise après avoir constaté que les mécanismes de communication entre le code Rust et le code JavaScript étaient les principaux facteurs de ralentissement.
Contexte Technique
Notre parseur openui-lang convertit un langage de définition spécifique émis par un modèle de langage en un arbre de composants React. Il fonctionne sur chaque chunk de transmission en continu, donc la latence est cruciale. Le pipeline comporte six étapes : autocloser, lexer, splitter, parser, résolveur et mappeur.
Le mécanisme de communication entre le code Rust et le code JavaScript, appelé « taxe de frontière WASM », implique une copie de la chaîne d'entrée du heap JavaScript vers la mémoire linéaire WASM, suivie d'une analyse rapide du code Rust, puis d'une sérialisation du résultat en une chaîne JSON, qui est ensuite copiée vers le heap JavaScript et désérialisée en un objet JavaScript.
Analyse et Implications
La réécriture du parseur en TypeScript a permis d'éliminer la taxe de frontière WASM, ce qui a entraîné une amélioration significative de la vitesse. Les résultats des benchmarks montrent que la version TypeScript est 2,2 à 4,6 fois plus rapide que la version WASM pour les différents fixtures.
De plus, l'implémentation d'un mécanisme de mise en cache incrémental pour les déclarations terminées par un saut de ligne à la profondeur 0 a permis de réduire la complexité algorithmique de O(N²) à O(total_length), ce qui a entraîné une amélioration supplémentaire de la vitesse.
Perspective
Il est important de surveiller les limites de cette approche, notamment en ce qui concerne la gestion des erreurs et la compatibilité avec les différents navigateurs. De plus, il faudra évaluer les performances de cette implémentation dans des scénarios réels pour garantir qu'elle répond aux besoins des utilisateurs.