CPM ← на главную

Как устроен движок

Страница для тех, кто хочет заглянуть под капот. Что считается, где и с какой скоростью; где границы и что за ними. Без маркетинга — цифры замерены, а не прикинуты.

Модель вычисления

Движок держит только листья — то, что реально ввёл человек. Все свёртки (итоги по иерархии, суммы по измерениям) считаются на лету из определений, а не хранятся. Число ячеек у строки — это произведение мощностей её измерений: строка на осях «время × ЦФО × номенклатура» с 12×40×2000 членами — это 960 000 комбинаций, и все они выводимы из одного определения формулы на строке.

Скорость и память (замерено)

~134 млн
ячеек/сек — компилированные плоские циклы (интерпретатор ~1–2 млн/с)
238 мс
полный пересчёт 18 млн ячеек; буферы 154 МБ (8 Б/значение + 1 Б происхождение)
~5 мкс
одна правка — независимо от размера модели (пересчёт срезом)

Семантика формул — компактный интерпретатор по AST; JS-компиляция поверх него (генерация плоского цикла) — снимаемое ускорение, а интерпретатор остаётся эталоном. Оба пути сверяются автотестами на приколоченных числах, чтобы ускорение никогда не меняло результат молча.

Лестница масштабирования

Принцип простой: не переходить на следующий уровень, пока не измерили, что текущего не хватает. Мерить есть чем — вот потолки по уровням.

УровеньПотолокПамятьПолный пересчётПравка
0 · интерпретатор, браузер2 млн16 МБ2 смикросекунды
1 · компиляция формул — сделано134 млн1 ГБ3 смикросекунды
2 · компиляция + сервер 16 ГБ2,1 млрд16 ГБ48 смикросекунды
3 · не храним производное———возврат на уровень 1
4 · ядро на Rust/WASMкогда упрёмся — не раньше
Любая казахстанская компания помещается в один сервер на 16 ГБ уже на текущем JS. Триггер уровня 4 — не страна, а число торговых точек: у крупнейшего ритейлера КЗ их 200–400, у X5 — около 30 000. Сто крат. До этого нативное ядро — выигрыш, который не нужен там, где нужно.

Архитектура

Где происходят вычисления

Движок — это обычный JavaScript, и работает он в браузере. Когда вы вводите число, гоняете симуляцию или разворачиваете дерево — вся математика идёт на вашем железе, мгновенно, без похода на сервер. Отсюда и масштабируемость показа: сколько людей открыло, столько браузеров и считает.

Кстати, эту страницу и демо считает ваш браузер — стенд лишь отдаёт файлы. Планировочную математику демо-посетителей сервер не крутит вовсе.

А браузер потянет?

Браузеры делают настоящие вычисления: движок (V8, JavaScriptCore) компилирует JavaScript в машинный код. Figma, онлайн-таблицы, редакторы видео считают в браузере куда тяжелее — у нас числовые циклы по типизированным массивам, для JIT это удобный случай. Ограничения есть, но для планирования не жмут:

Запасной выход. Если модель когда-нибудь перерастёт браузер — тот же движок (он ни от чего в браузере не зависит) запускается на сервере в Node, это уровень 2 лестницы. «Слишком большое для браузера» — не тупик, а переключатель: считаем на сервере, браузер только показывает.

Где это ставится

Продукт — тот же движок плюс тонкий сервер, упакованные в контейнер (Node, ноль зависимостей, Docker). Разворачивается двумя способами, и для финансов почти всегда первый:

Честные пределы

Порядок, в котором всё упрётся на самом деле — а не приятный:

Цифры — из внутренних замеров (перезамер на 18 млн ячеек). Точные алгоритмы и код — в приватном репозитории. Вопросы по инженерии — велкам.