Skip to content

[0.3] Воспроизводимый benchmark dashboard против Motion, GSAP и Anime.js #95

Description

@lemone112

Пользовательский результат

Потребитель видит проверяемые различия библиотек по конкретным сценариям и может воспроизвести результат, не доверяя маркетинговому утверждению.

Источник данных

Dashboard читает только машинно-сгенерированные результаты bench/compare. Ручное редактирование чисел запрещено. Каждый результат содержит:

  • commit lab-motion;
  • версии всех участников;
  • дату и среду;
  • конфигурацию браузера и CPU throttling;
  • число прогонов и метод агрегации;
  • сценарий и platform control;
  • ограничения интерпретации.

Сценарная матрица

Стоимость старта

  • один элемент;
  • 100 элементов одним вызовом;
  • stagger 200 элементов;
  • cold и warm path отдельно.

Runtime continuity

Ресурсы

  • main-thread wakeups;
  • allocations/GC на горячем пути;
  • import cost;
  • shipped entry size;
  • cleanup после cancel/destroy.

Compiler / pay-for-use

После baseline #208 и эпика #220 матрица обязана различать:

  1. nano без compiler;
  2. тот же статический вызов после build-time lowering;
  3. dynamic positive-control, который compiler не трогает;
  4. raw WAAPI с теми же keyframes/timing как platform floor;
  5. после feat(compiler): понижать статические NanoProps/NanoOptions, не только opacity #221 — multi-property spring/tween + delay/stagger;
  6. после feat(compiler): статические N-keyframes → compact MotionProgram после #205 #222 — статический N-keyframe track против dynamic ./animate feat(animate): объединить N-keyframe tracks общим owner/lifecycle #205.

Для каждого compiler-сценария фиксировать отдельно:

  • build-plugin cost — build side, не browser bundle;
  • browser initial gzip/Brotli/raw;
  • browser reachable total с dynamic chunks;
  • фактический module graph и отсутствие/presence solver/parser;
  • synchronous call setup;
  • native Element.animate cost;
  • cold compile и warm/cache path для uncompiled runtime;
  • main-thread callbacks после запуска;
  • размер/число serialized linear() stops;
  • compiled/uncompiled browser-differential.

5 KB из #220 — consumer ceiling common-сценария, а не разрешение сравнивать compiled Lab Motion с полным competitor entry без одинаковой функциональной поверхности.

Controls

  • чистый WAAPI для compositor-сценариев;
  • пустой rAF loop для стоимости harness;
  • одинаковый линейный tween, когда физические модели несопоставимы;
  • одинаковый фактически serialized plan, когда сравнивается executor overhead;
  • no-compiler Lab Motion как контроль стоимости lowering.

Правила честности

  • вывод формулируется только для измеренного сценария;
  • «быстрее библиотек» без уточнения сценария запрещено;
  • lazy work учитывается или явно отделяется от synchronous start cost;
  • spring-модели разных библиотек не сравниваются как одинаковая траектория;
  • compiled common-case не сравнивается с full competitor bundle как общий рейтинг;
  • wall-time одной машины не является единственным CI-гейтом;
  • vendor-числа без собственного измерения помечаются отдельно;
  • собственный проигрыш публикуется наравне с выигрышем.

Поставка

  • JSON schema результата;
  • schema различает build-side, initial, lazy и total costs;
  • генерация Markdown/страницы без ручного копирования чисел;
  • методология рядом с каждым графиком;
  • команда локального воспроизведения;
  • артефакты trace/screencast для freeze-сценария;
  • compiler fixtures из packed tarball, а не source alias-only;
  • профиль измерения в существующем self-hosted de-04 pool: фиксированная среда, ограниченный параллелизм и baseline-only калибровка по PROFILE-01 активного плана;
  • PR-комментарий только при статистически значимом регрессе;
  • исторический ряд по release tags, а не по случайным локальным веткам.

Критерии приёмки

  • существующий результат 2026-07-09-dda628e проходит schema validation;
  • dashboard строится из результата без ручных чисел;
  • platform controls доказывают корректность измерительного инструмента;
  • опубликованы все зарегистрированные результаты, включая каждый наблюдённый проигрыш или отсутствие преимущества; неуспешные controls/запуски и cold/warm пути сохранены;
  • новая версия участника не подменяется незаметно lockfile-диапазоном;
  • документация различает shipped size, consumer initial и reachable total;
  • feat(compiler): Vite lowering для статического nano opacity #208 opacity baseline импортирован как первый compiler history point;
  • feat(compiler): понижать статические NanoProps/NanoOptions, не только opacity #221 common multi-property result публикуется только после browser/tarball acceptance;
  • FLIP/projection benchmark добавляется только после стабильного API [0.5] Реализовать production-ready ./projection #98.

Не-цели

  • единый суммарный рейтинг библиотек;
  • benchmark как замена browser conformance tests;
  • CI failure по абсолютному наносекундному порогу на общей машине;
  • marketing claim до измеренного и воспроизводимого result set.

Связано: #98, #106, #195, #208, #220, #221, #222.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions