Andrey Epifancev 8e9f53a478 perf: скрипты разбора и сводные данные прогонов 20261026
- perf/analysis: разбор trace (timeline_breakdown), CPU-профилей с source maps
  (cpuprofile_top), heap snapshots (heapdiff), циклов памяти, сравнения масштабов,
  ручной EXPLAIN вложенных запросов (explain_manual), API против X-DB-Time-Ms
  (api_split), сводка горячих точек; тесты ядра в perf/tests/test_analysis.py
- perf/e2e/scenarios/hotspots.spec.ts: CPU-профиль, рендеры React, мутации DOM
  после фильтра, рост CSS-правил по циклам (вне run-all)
- prod-сборка с source maps: PERF_SOURCEMAP=1, perf/stand.sh web-sourcemap (:8082)
- perf/report-data/20261026-s1, 20261026-s2 (summary, sql, analysis, explain-manual),
  t5-types (иллюстрация CPU 6x)
- design.md: решения T10b без обсуждения

Refs #202

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 12:43:46 +04:00

5.4 KiB
Raw Blame History

Рабочие заметки T10b (промежуточные, для восстановления контекста)

Данные: s1 = perf/results/20261026-s1 (агрегаты report-data/20261026-s1), s2 = 20261026-s2 (1 повтор, R-4). Профили горячих точек: perf/results/20261026-hot (hotspots.spec.ts) на восстановленных данных масштаба 1 (R-6, шаг 0 выполнен 2026-10-26 12:05: reset + gen s1 + verify OK + grow s1 + smoke OK; манифест структурно совпадает с копией прогона).

Скролл (A.5)

  • main_thread_ms_per_step ≈ 75–95 мс на листах/отчётах независимо от числа строк (AHR_RENT 31 строка 77, AHR 1154 строки 89); s2 листы те же (AHR 85): виртуализация работает, цена шага постоянна и высока.
  • trace (timeline-breakdown.md): scripting 60–70 мс/шаг, rendering (style) 10–21, gc 4–5; своды 2 — 150–185 мс/шаг, s2 — 251–256 (растёт со строками).
  • CPU-профиль (cpuprofile-top.md, hot-FORM_2_AHR_null-y): emotion serialize/styled/hash + mui styleFunctionSx ≈ 30 %, offsetHeight из measureElement RealtimeTable.jsx:42 — 14 % (принудительный layout; высота строки фиксирована 80 px).
  • React (hotspot_react.jsonl): FORM_2/AHR — 3,3 коммита и ~14,8 тыс. рендеров компонентов на шаг колеса; Styled(td) 1,7 тыс. рендеров на шаг (~500 видимых ячеек × 3,3 коммита), 48 % self time. memoMode в MRT не задан (constants/tableConfig.js:3-36).
  • Своды 1 / сводные проектов: SummaryTable.jsx:69 Cell (new Intl.NumberFormat на каждый рендер ячейки, :75) 14–23 %, measureElement SummaryTable.jsx:13 8–12 %.

Фильтр свода 2 GO (A.2) — см. hot-svod2 (в работе)

SQL (A.3, A.4, B)

  • upd_form_cell (coauthor sql_top): 304 вызова × 630 мс; внутри upd_form_cells дважды v_form_view всего листа (до: 0033_form2_old_sort.sql:1460-1466, после: :1527-1534) — 316 + 311 мс. Пропускная способность одного WS соединения ≈ 1/0,63 с ≈ 1,6 правки/с; факт: (62 эха + 10 ошибок)/45,8 с ≈ 1,57/с при rate 5 (scroll_coauthor.jsonl). WS-цикл последовательный: websocket.py:973-1130.
  • FORM_4/CAP (300 строк): v_form_view 1,55 с (explain-manual, bench.json); три уровня GROUP BY с агрегатом v3.jsonb_sum (0012_del_project.sql:1418-1481; рекурсивная SQL-функция 0010_form4.sql:269-297) по ~500 мс каждый.
  • FORM_2/AHR: v_form_view ≈ 530–620 мс; вложенный WITH tw ≈ 471 мс, из них JIT ≈ 138 мс/вызов (pgss_form_view_ahr.json: 2335 функций за 8 вызовов, 1106 мс); тело без JIT 240 мс (EXPLAIN jit_off). Temp ~3270 блоков (25 МБ) на вызов — tuplestore RETURN QUERY; 64MB work_mem убирает temp, время в установившемся режиме не меняет.
  • s1→s2: GET FORM_2/AHR 861 мс (1154 строки) → 4789 мс (1744 строки): ×5,6 при ×1,5 строк — сверхлинейно.
  • py-spy: требует root на macOS («This program requires root on OSX») — не запускался (sudo запрещён). Критерий 2× не выполнен ни для одного тяжёлого эндпоинта (svod2 ×1,5, CAP ×1,1–1,4, AHR ×1,4) — профиль Python и не требовался.

Память (B)

  • heapdiff.md (циклы 10→20): рост self size 23,1 → 27,2 МБ, главный — нативные Blink MediaQuery/MediaQuerySet/ MediaQueryFeatureExpNode (+23 161 шт. каждого), удерживаются StyleEngine документа → CSS-правила с @media копятся (emotion вставляет правила и не удаляет). JS-объекты: рост мал (Object +1121, closures). Проверка — cssgrowth (в работе).

R-5

FORM_4/STRUCTURE: v_form4_view для STRUCTURE берёт только строки row_type != 'INPUT' (0033_form2_old_sort.sql:387-395), фронт делает редактируемыми только INPUT (tableColumns.jsx:132) — правок ячеек на этом листе нет в приложении, бот прав.

Дополнения (по ходу)

  • После grow лист FORM_2/AHR = 2 092 строки (1154 до): строки сателлитов UTILITY/SECURITY попадают в AHR. Bench, модалки, память, hotspots, explain-manual и контроль 4× — на 2 092 строках; скролл и соавтор основного прогона — на 1154.
  • Фильтр свода 2 GO (A.2): 0 мутаций DOM за 30 с после ввода — артефакт критерия (hotspots.md).
  • Справочник ВСП: таблица без виртуализации (TableDictVsp.jsx:238-247), модалки 150–195 → 500–610 мс на s2.
  • Svod2Page: нет колоночной виртуализации; 7,8 тыс. Styled(td) на шаг.
  • Контроль 4× — отдельный run_id 20261026-control-s1 (решение в design.md).