Я подробно изучил задачу #352 (Investigate Scala.js WebAssembly backend for performance improvements), провёл локальное тестирование, запуск бенчмарков (JS vs Wasm) и проанализировал интеграцию в dicechess-analytics-ui.
Результаты исследования оформлены в виде артефакта: wasm_investigation.md.
Краткие выводы исследования:
-
Размер пакета (Wasm выигрывает на ~64%):
- Pure JS (
@rabestro/dicechess-engine): 1.37 МБ (dicechess-engine.js). - Wasm (
@rabestro/dicechess-engine-wasm): 487 КБ суммарно (main.wasm+ загрузчики).
- Pure JS (
-
Производительность (Wasm быстрее до 2.6x):
- На быстрых синхронных вызовах (генерация ходов, Greedy-поиск) прирост небольшой (1.09x – 1.32x), так как большую часть времени занимает накладной расход на сериализацию/десериализацию данных на границе JS/Wasm.
- На тяжелых вычислениях (симуляция Монте-Карло для
estimateEquity), проходящих целиком внутри Wasm-памяти без перехода в JS, Wasm показывает ускорение в 2.58x (31.6s против 73.8s для 100 итераций).
-
Стратегия публикации (Два отдельных пакета — оптимально):
- Архитектура сборки и CI-пайплайны (
publish.yaml,release.yaml) уже настроены на параллельную публикацию@rabestro/dicechess-engine(JS) и@rabestro/dicechess-engine-wasm(Wasm). - Рекомендуется сохранить текущую схему с двумя пакетами. Это позволяет использовать легкий синхронный JS-движок в главном потоке браузера (для мгновенной валидации ходов без async/await и лишней настройки сборщиков), а тяжелый Wasm-движок запускать асинхронно в фоновом Web Worker (как это уже сделано в
dicechess-analytics-uiчерезcopy-wasm.mjs).
- Архитектура сборки и CI-пайплайны (
Сборка Wasm (sbt rootWasm/fullLinkJS), тесты (sbt rootWasm/test) и релизные скрипты работают исправно и не требуют изменений. Задачу можно закрывать как выполненную.