emscripten pour améliorer kiwix-js

Au dernier hackathon Kiwix, on a joué un peu avec emscripten pour améliorer kiwix-js.

Activation des optimisations asm.js sur xzdec

La décompression XZ était déjà assurée par du code généré depuis du C par emscripten : xzdec.js.

Mais, il s’agissait de code javascript « almost asm » (il y avait cette chaine dans le code javascript), qui ne permettait pas aux navigateurs d’activer les optimisations asm.js.

En le recompilant avec d’autres options (cf https://github.com/kiwix/kiwix-js/issues/219), on a pu passer en « use asm ». Résultat : la décompression XZ est plus de 2 fois plus rapide.

On avait initialement prévu de compiler en WebAssembly, mais ça n’apportait pas de gain de performance significatif dans notre cas de figure. Et ça aurait limité les plateformes compatibles (oui, on supporte de vieux moteurs HTML/javascript sur kiwix-js).

Compilation de libzim avec emscripten

Dattaz avait déjà réussi à compiler la libzim avec emscripten : https://github.com/dattaz/libzim_wasm avec un prototype très prometteur : https://dattaz.github.io/libzim_wasm/file_api/index.html.

Je suis reparti de son code pour l’adapter à la dernière version de la libzim (qui a beaucoup évolué entre-temps) : https://github.com/mossroy/libzim_wasm. Il a fallu que j’applique quelques patchs sur le code (en mode quick-and-dirty) pour que la compilation fonctionne, et soit reproductible.

J’ai ensuite fait évoluer un peu le prototype pour permettre l’appel de fonctions C++ depuis le javascript, sur un cas simple : https://mossroy.github.io/libzim_wasm/. Ca fonctionne!

Je n’ai pas eu le temps d’aller plus loin que ce bout de prototype pour l’instant, mais ça ouvre la porte à une future utilisation de la libzim dans kiwix-js. On peut espérer de meilleures performances (voir les commentaires de https://github.com/kiwix/kiwix-js/issues/116), ainsi que l’accès à toutes les fonctionnalités qu’on n’avait pas implémentées en javascript.

Par contre, il y a un bug avec les fichiers de plus de 2Go (qui avait déjà été repéré par dattaz l’an dernier) : https://github.com/kripken/emscripten/issues/5250. kripken « himself » a regardé, et a conclu qu’il s’agit d’une limitation de emscripten, mais qui ne semble pas facile à corriger (il l’a taggé en « help wanted » sur github).

Enfin, il faudra peut-être compiler et utiliser kiwix-lib plutôt que libzim pour avoir des APIs d’un peu plus haut niveau.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *