Plan 0b : résultat, documentation de la suite WebAssembly

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Pierre MARTIN
2026-11-02 19:20:04 +01:00
co-authored by Claude Opus 5.5
parent 120367e6d3
commit d83dbfb1e5
3 changed files with 76 additions and 4 deletions
+66 -1
View File
@@ -89,4 +89,69 @@ contrat en WebAssembly (écart maximal), difficultés, écarts au plan.
## Résultat
À remplir à la clôture.
**Statut : terminé** (2026-11-02, branche `wasm-travail`). Tous les critères
de réussite sont tenus ; reste la mesure sur le Fairphone 4 par Pierre
(`docs/guide-test-etape-0.md`).
Ce qui a été fait :
- `make engine-wasm` (`engine-wasm/wasm.mk`) compile dans
`emscripten/emsdk:3.1.64` les mêmes sources que le natif (liste commune
`engine/sources.mk`), plus `engine-cli/main.c`, en C générique, sans
threads, `-O3 -ffast-math`. Les données de `build/data/` sont embarquées
dans `engine.data` (`--preload-file`, système de fichiers virtuel, `/data`).
Recompilation nulle si rien n'a changé.
- Interface JavaScript (`web/engine-wasm.mjs`) : le module appelle
`engine_init` une fois, puis `main` d'engine-cli pour chaque commande
(`callMain`) ; la sortie est exactement le JSON d'engine-cli, sans code de
mise en JSON dupliqué. Seule modification du C : `main` n'appelle pas
`engine_shutdown` sous Emscripten. Fonctions `bestMove`, `cubeDecision`,
`evaluate`, `reference`.
- Suite de contrat : `tests/test_wasm_reference.sh` (lancé par `make test`)
rejoue les 32 positions à 0 et 2 plis sous Node avec
`engine-wasm/engine-cli.mjs`, qui imite engine-cli ; `compare.py --cli`
accepte désormais une commande avec arguments. Résultat : **2 598 nombres
comparés, écart maximal 9,53e-4** (le même cas `opening-64-match` qu'en
natif), tolérance 2e-3. Comparé directement au natif : mêmes classements,
mêmes décisions, écart maximal 2,3e-6.
- `web/` : page de test (`index.html`), page de mesure (`bench.html`),
Worker en module ES (`engine-worker.mjs`), client (`engine-client.mjs`),
mesure partagée avec Node (`benchmark.mjs`). Aucun framework, aucune étape
de build.
- `make deploy-web` : serveur HTTP de Python dans l'image `build-c` (aucune
nouvelle image), adresse LAN affichée (route par défaut), Ctrl+C l'arrête
(vérifié). `make deploy` renvoie vers `make deploy-web`. `make bench` :
même mesure sous Node.
Vérification de la page : Chromium 130 et Firefox 131 sans interface (image
`mcr.microsoft.com/playwright:v1.48.2-noble`, utilisée une fois, hors du
dépôt), ouverts sur l'adresse LAN `http://192.168.1.21:8080/` (contexte non
sécurisé, comme le téléphone) : meilleur coup de `middlegame-1` à 2 plis
(`24/14`, 305 ms Chromium, 2 433 ms Firefox), mesure complète, bouton de copie
fonctionnel. Types MIME vérifiés par curl : `application/wasm`,
`text/javascript` pour les `.mjs`.
Mesures sur le PC (i5-2450M, 2011) :
| Mesure (max sur les positions) | Node 18 | Chromium 130 | Firefox 131 | Seuil |
| --- | --- | --- | --- | --- |
| Meilleur coup 0 pli | 2 ms | 5 ms | 14 ms | 300 ms |
| Meilleur coup 2 plis (médiane / max) | 107 / 454 ms | 87 / 316 ms | 693 / 2 341 ms | 3 000 ms |
| Videau 2 plis (médiane / max) | 27 / 109 ms | 21 / 103 ms | 158 / 902 ms | 3 000 ms |
| Chargement du moteur | 82 ms | 178 ms | 204 ms | |
| Mémoire WebAssembly | 51,9 Mo | 51,9 Mo | 51,9 Mo | |
Taille téléchargée : 9,0 Mo non compressée, **7,3 Mo compressée gzip** (seuil
40 Mo), dont `engine.data` 8,7 Mo (7,2 Mo gzip), `engine.wasm` 180 Ko
(78 Ko gzip), `engine.mjs` 73 Ko (20 Ko gzip).
Points d'attention : Firefox sans interface est environ 7 fois plus lent que
Chromium sur le même PC, à vérifier sur le téléphone (le guide demande les
deux navigateurs). La mémoire de 52 Mo vient surtout des bases de fin de
partie copiées en mémoire et du cache d'évaluation de gnubg ; les données
existent en plus une fois côté JavaScript (système de fichiers virtuel).
Écarts au plan : aucun sur le fond. Fichiers en `.mjs` (modules ES partagés
entre navigateur et Node sans `package.json`) ; seuils jugés sur le maximum,
la médiane étant donnée en plus ; la taille compressée est calculée par la page
(CompressionStream) car le serveur de test ne compresse pas.