Производительность FTS: benchmark и влияние на сборку
FTS benchmark разделяет compile, validate, execute, generation, transpilation и examples. Это важно: фраза «компиляция стала медленнее» без разделения этапов не показывает причину.
Baseline Apple M1 Max, Node.js 24.6.0:
| Операция | 10 | 100 | 1000 |
|---|---|---|---|
| Compile | 0.0511 ms | 0.3937 ms | 4.3608 ms |
| Validate | 0.0102 ms | 0.0883 ms | 1.0154 ms |
| Execute matching rules | 0.0010 ms | 0.0021 ms | 0.0157 ms |
| Generate TypeScript | 0.0065 ms | 0.0392 ms | 0.3704 ms |
| Transpile generated TS | 1.8410 ms | 3.6606 ms | 22.9837 ms |
| Test examples | 0.0021 ms | 0.0152 ms | 0.1611 ms |
При масштабе 1000 compile + validate занимает около 5.38 ms на этой машине. 1000 означает синтетические поля/правила, а не «1000 строк любого проекта».
Что числа не доказывают
transpileModule не включает полный type graph, bundler, плагины, sourcemaps и
incremental cache приложения. Поэтому baseline не обещает, что ваш Vite build
вырастет ровно на 23 ms.
Application benchmark
- Зафиксируйте Node, package lock и режим CPU.
- Прогрейте cache одинаково.
- Измерьте минимум 20 сборок до интеграции.
- Добавьте реальные модели и generation.
- Измерьте отдельно clean и incremental build.
- Сравнивайте median и p95, а не один запуск.
hyperfine --warmup 3 --runs 20 \
'npm run build:before' \
'npm run build:fts'
Как уменьшить цену
- компилировать модель один раз при старте;
- генерировать только изменившиеся документы;
- не включать certificate crypto в browser bundle;
- использовать browser entrypoint;
- отделять
fts testот hot reload, если моделей много; - сохранять benchmark baseline рядом с версией runtime.
Упражнение
Снимите baseline проекта без FTS и с десятью моделями. Запишите версии, команды, median и p95. Если разница меньше шума, так и напишите — отсутствие измеримого ухудшения полезнее маркетингового процента.