Files
Pierre MARTINandClaude Opus 5.5 a8636b3f83 Plateau jouable en PWA : interface, Web Worker, stockage, service worker
L'application est à la racine du site : plateau en SVG, saisie au toucher
(pion puis case d'arrivée, proposées à partir du moteur), boutons du jet,
du videau et de nouvelle partie, coup de l'ordinateur affiché avec son
temps, fin de partie, reprise depuis localStorage, aide lue dans les
copies de docs/. Le moteur tourne dans le Web Worker existant ; main.ts
est le seul assembleur (nouvelles règles dependency-cruiser). Le service
worker met tout le site en cache, avec une empreinte du contenu comme
version. Les pages de test du moteur passent sous /moteur/. Politique de
sécurité du contenu dans le Caddyfile ; make test-browser joue une partie
dans Chromium et Firefox sans écran (Playwright, hors de make test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:47:12 +01:00

45 lines
1.9 KiB
JavaScript

// bench.mjs -- la mesure de la page bench.html, sous Node, sur le PC
// (`make bench`). Premier ordre de grandeur seulement : le chiffre qui compte
// est celui du téléphone.
//
// Copyright (C) 2026 les auteurs d'Ustagammon.
// Licence : GPLv3 ou ultérieure (voir LICENSE).
import { readFileSync } from "node:fs";
import os from "node:os";
import { fileURLToPath } from "node:url";
import { gzipSync } from "node:zlib";
import createEngineModule from "../build/wasm/engine.mjs";
import { DOWNLOADED_FILES, formatReport, measureTimes } from "../web/moteur/benchmark.mjs";
import { commands, loadEngine } from "../web/engine-wasm.mjs";
const root = new URL("../", import.meta.url);
const wasmDir = fileURLToPath(new URL("build/wasm/", root));
// Les fichiers du site : web/, et build/wasm/ servi sous wasm/.
function sitePath(name) {
const path = name.startsWith("wasm/") ? "build/" + name : "web/" + name;
return fileURLToPath(new URL(path, root));
}
const files = DOWNLOADED_FILES.map((name) => {
const content = readFileSync(sitePath(name));
return { name, bytes: content.length, gzipBytes: gzipSync(content).length };
});
const start = performance.now();
const engine = await loadEngine(createEngineModule, wasmDir);
const loadMs = performance.now() - start;
const { positions } = JSON.parse(readFileSync(sitePath("wasm/positions.json"), "utf8"));
const times = await measureTimes({
bestMove: (...args) => engine.run(commands.bestMove(...args)),
cubeDecision: (...args) => engine.run(commands.cubeDecision(...args)),
}, positions, (done, total) => process.stderr.write("\r " + done + "/" + total + " calculs"));
process.stderr.write("\n");
const environment = "Node " + process.version + ", " + os.cpus()[0].model + " (PC de développement)";
process.stdout.write(formatReport({
environment, files, loadMs, memoryBytes: engine.memoryBytes(), times,
}));