Профилирование фронта и бэка: стенд, замеры, отчёт (#202) #203

Merged
aep merged 28 commits from feat/202-perf-profiling into test 2026-10-28 16:11:09 +03:00
27 changed files with 3898 additions and 10 deletions
Showing only changes of commit 9923a7b88d - Show all commits

View File

@ -43,10 +43,10 @@ def main(argv=None):
pr = man["project_reports"][0]
year = f2["year"]
reqs = [
("rf", f"лист FORM_2/AHR ({f2['rows']} строк)", f"/api/v1/form/{f2['form_id']}/sheet/AHR"),
("rf", f"лист FORM_4/CAP ({f4c['rows']} строк)", f"/api/v1/form/{f4c['form_id']}/sheet/CAP"),
("rf", f"лист FORM_4/AHR ({f4a['rows']} строк)", f"/api/v1/form/{f4a['form_id']}/sheet/AHR"),
("rf", f"отчёт проекта {pr['report_type']} ({pr['rows']} строк)", f"/api/v1/projects/{pr['project_id']}/report/{pr['year']}/{pr['report_type']}"),
("rf", "лист FORM_2/AHR", f"/api/v1/form/{f2['form_id']}/sheet/AHR"),
("rf", "лист FORM_4/CAP", f"/api/v1/form/{f4c['form_id']}/sheet/CAP"),
("rf", "лист FORM_4/AHR", f"/api/v1/form/{f4a['form_id']}/sheet/AHR"),
("rf", f"отчёт проекта {pr['report_type']}", f"/api/v1/projects/{pr['project_id']}/report/{pr['year']}/{pr['report_type']}"),
("dfip", "свод 1 MAIN", f"/api/v1/svod/1/MAIN/{year}"),
("dfip", "свод 2 GO (все организации)", f"/api/v1/svod/2/GO/{year}"),
("dfip", "свод 2 RF (все организации)", f"/api/v1/svod/2/RF/{year}"),
@ -69,11 +69,12 @@ def main(argv=None):
dt = (time.perf_counter() - t0) * 1000
r.raise_for_status()
if i == 0:
rows = len(r.json().get("result") or []) # фактическое число строк ответа (манифест - до grow)
continue # прогрев
tot.append(dt)
db.append(float(r.headers.get("x-db-time-ms", "nan")))
size = len(body)
row = {"role": role, "request": label, "path": path, "total_ms": round(statistics.median(tot), 1),
row = {"role": role, "request": f"{label} ({rows} строк ответа)", "rows": rows, "path": path, "total_ms": round(statistics.median(tot), 1),
"db_ms": round(statistics.median(db), 1), "bytes": size, "content_encoding": r.headers.get("content-encoding")}
row["python_ms"] = round(row["total_ms"] - row["db_ms"], 1)
row["python_share"] = round(row["python_ms"] / row["total_ms"], 2)

View File

@ -25,6 +25,8 @@ def main(argv=None):
ap = argparse.ArgumentParser()
ap.add_argument("run_dir")
ap.add_argument("--out", required=True)
ap.add_argument("--name", default="hotspots", help="базовое имя выходных файлов")
ap.add_argument("--renders-only", action="store_true", help="только modal_renders (например для основного прогона)")
a = ap.parse_args(argv)
rd, out = Path(a.run_dir), Path(a.out)
out.mkdir(parents=True, exist_ok=True)
@ -51,15 +53,23 @@ def main(argv=None):
elif m.get("steps"):
res["cpu"].append({"target": r["target"], "role": r["role"], "steps": m["steps"], "main_thread_ms_per_step": round(m["main_thread_ms_per_step"], 1),
"artifacts": r["artifacts"]})
for r in load(rd / "modal.jsonl"):
for r in ([] if a.renders_only else load(rd / "modal.jsonl")):
res["modal"].append({"target": r["target"], "role": r["role"], "click_to_visible_ms": round(r["metrics"]["click_to_visible_ms"], 1),
"main_thread_ms": round(r["metrics"]["main_thread_ms"], 1)})
for r in load(rd / "modal_renders.jsonl"):
m = r["metrics"]
res["modal_renders"].append({"target": r["target"], "commits": m["commits"], "renders": m["total_renders"],
"self_ms": round(m["total_self_ms"], 1), "top": [[x["component"], x["renders"], round(x["self_ms"], 1)] for x in m["renders_top"][:6]]})
(out / "hotspots.json").write_text(json.dumps(res, ensure_ascii=False, indent=1))
(out / f"{a.name}.json").write_text(json.dumps(res, ensure_ascii=False, indent=1))
if a.renders_only:
md = [f"# Рендеры React при открытии модалок: {rd.name} (modal_renders.jsonl, hotspots_summary.py --renders-only)", "",
"| модалка | коммитов | рендеров | self, мс | топ компонентов (рендеры/self мс) |", "|---|---|---|---|---|"]
md += [f"| {r['target']} | {r['commits']} | {r['renders']} | {r['self_ms']} | " + "; ".join(f"{c} {n}/{s_}" for c, n, s_ in r["top"][:6]) + " |"
for r in res["modal_renders"]]
(out / f"{a.name}.md").write_text("\n".join(md) + "\n")
print("\n".join(md))
return
md += ["## Рендеры React на шаг колеса 200 px (профилирующая сборка :8081)", "",
"| target | роль | шагов | коммитов/шаг | рендеров компонентов/шаг | из них Styled(td)/шаг | self React, мс | main thread/шаг, мс |", "|---|---|---|---|---|---|---|---|"]
md += [f"| {r['target']} | {r['role']} | {r['steps']} | {r['commits_per_step']} | {r['renders_per_step']} | {r['td_renders_per_step']} | {r['react_self_ms']} | {r['main_thread_ms_per_step']} |" for r in res["react"]]
@ -76,7 +86,9 @@ def main(argv=None):
md.append(f"| {r['mode']} | {r['target']} | {r['main_thread_ms']} | {mu['frames']} | {mu['frames_with_mutation']} | {mu['first_mutation_frame']} | "
f"{mu['long_task_n']} ({', '.join(f'{d} мс' for _, d in mu['long_tasks'][:3])}) | {kinds} | {r.get('commits', '')} коммитов / {r.get('renders', '')} |")
for g in res["cssgrowth"]:
md += ["", f"## Рост CSS-правил и matchMedia по циклам: {g['target']}", "",
variant = ("цикл AHR -> скролл -> /tasks -> второй лист -> скролл -> /tasks, со счётчиком matchMedia"
if any("matchmedia_calls" in c for c in g["cycles"]) else "цикл AHR -> скролл 40 шагов -> /tasks")
md += ["", f"## Рост CSS-правил и matchMedia по циклам: {g['target']} ({variant})", "",
"| цикл | main thread/шаг, мс | CSS-правил | @media | style | вызовов matchMedia | нетто listeners matchMedia |", "|---|---|---|---|---|---|---|"]
for c in g["cycles"]:
md.append(f"| {c['cycle']} | {c.get('scroll_ms_per_step', '')} | {c['css_rules']} | {c['css_media_rules']} | {c['style_elements']} | {c.get('matchmedia_calls', '')} | {c.get('matchmedia_listeners_net', '')} |")
@ -89,7 +101,7 @@ def main(argv=None):
if res["modal_renders"]:
md += ["", "| модалка | коммитов | рендеров | self, мс | топ |", "|---|---|---|---|---|"]
md += [f"| {r['target']} | {r['commits']} | {r['renders']} | {r['self_ms']} | " + "; ".join(f"{c} {n}/{s}" for c, n, s in r["top"][:4]) + " |" for r in res["modal_renders"]]
(out / "hotspots.md").write_text("\n".join(md) + "\n")
(out / f"{a.name}.md").write_text("\n".join(md) + "\n")
print("\n".join(md))

View File

@ -0,0 +1,24 @@
{
"scale": 1,
"plan": {
"org_units_ssp": 3,
"org_units_rf": 6,
"vsp_per_rf": 30,
"extra_lines_per_sheet": 500,
"projects_per_rf": 4,
"fill_ratio": 0.6
},
"elapsed_s": 657.4,
"requests": 26832,
"stats": {
"form4_projects": 108,
"bad_leaves": 0,
"lines_added": 22800,
"cells_written": 505016,
"satellite_lines": 540,
"phases_created": 258,
"projects": 24,
"project_phases_created": 144,
"self_check": 1
}
}

View File

@ -0,0 +1,26 @@
[
{
"sheet": "FORM_2/AHR_UTILITY",
"form_id": 7,
"before": 31,
"after": 500,
"added": 469,
"seconds": 0.8
},
{
"sheet": "FORM_2/AHR_SECURITY",
"form_id": 7,
"before": 31,
"after": 500,
"added": 469,
"seconds": 0.8
},
{
"sheet": "FORM_4/CAP",
"form_id": 13,
"before": 110,
"after": 300,
"added": 190,
"seconds": 208.7
}
]

View File

@ -0,0 +1,495 @@
{
"scale": 1,
"users": {
"admin": {
"username": "admin",
"password": "admin",
"role_id": 1
},
"rf": {
"username": "perf_rf",
"password": "perf",
"role_id": 3
},
"rf_coauthor": {
"username": "perf_rf_coauthor",
"password": "perf",
"role_id": 3
},
"dfip": {
"username": "perf_dfip",
"password": "perf",
"role_id": 2
}
},
"sheets": [
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "OPER",
"direction": null,
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/OPER/null/2026",
"rows": 547,
"owner": "ssp"
},
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "SMETA",
"direction": null,
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/SMETA/null/2026",
"rows": 130,
"owner": "ssp"
},
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "AHR",
"direction": "Support",
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/AHR/Support/2026",
"rows": 1022,
"owner": "ssp"
},
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "AHR",
"direction": "Development",
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/AHR/Development/2026",
"rows": 1022,
"owner": "ssp"
},
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "CAP",
"direction": "Support",
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/CAP/Support/2026",
"rows": 708,
"owner": "ssp"
},
{
"form_id": 1,
"form_type": "FORM_1",
"sheet": "CAP",
"direction": "Development",
"year": 2026,
"url": "/table/form/1/form-type/FORM_1/CAP/Development/2026",
"rows": 708,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "AHR",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/AHR/null/2026",
"rows": 1066,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "CAP",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/CAP/null/2026",
"rows": 708,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "OPER",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/OPER/null/2026",
"rows": 547,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "AHR_LIMIT",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/AHR_LIMIT/null/2026",
"rows": 27,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "AHR_RENT",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/AHR_RENT/null/2026",
"rows": 1,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "AHR_UTILITY",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/AHR_UTILITY/null/2026",
"rows": 1,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "AHR_SECURITY",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/AHR_SECURITY/null/2026",
"rows": 1,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "OTCH9F",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/OTCH9F/null/2026",
"rows": 1,
"owner": "ssp"
},
{
"form_id": 4,
"form_type": "FORM_2",
"sheet": "SMETA",
"direction": null,
"year": 2026,
"url": "/table/form/4/form-type/FORM_2/SMETA/null/2026",
"rows": 134,
"owner": "ssp"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "AHR",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/AHR/null/2026",
"rows": 1154,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "CAP",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/CAP/null/2026",
"rows": 708,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "OPER",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/OPER/null/2026",
"rows": 547,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "AHR_LIMIT",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/AHR_LIMIT/null/2026",
"rows": 27,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "AHR_RENT",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/AHR_RENT/null/2026",
"rows": 31,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "AHR_UTILITY",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/AHR_UTILITY/null/2026",
"rows": 500,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "AHR_SECURITY",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/AHR_SECURITY/null/2026",
"rows": 500,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "OTCH9F",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/OTCH9F/null/2026",
"rows": 1,
"owner": "rf"
},
{
"form_id": 7,
"form_type": "FORM_2",
"sheet": "SMETA",
"direction": null,
"year": 2026,
"url": "/table/form/7/form-type/FORM_2/SMETA/null/2026",
"rows": 134,
"owner": "rf"
},
{
"form_id": 13,
"form_type": "FORM_4",
"sheet": "AHR",
"direction": null,
"year": 2026,
"url": "/table/form/13/form-type/FORM_4/AHR/null/2026",
"rows": 110,
"owner": "rf"
},
{
"form_id": 13,
"form_type": "FORM_4",
"sheet": "CAP",
"direction": null,
"year": 2026,
"url": "/table/form/13/form-type/FORM_4/CAP/null/2026",
"rows": 300,
"owner": "rf"
},
{
"form_id": 13,
"form_type": "FORM_4",
"sheet": "OPER",
"direction": null,
"year": 2026,
"url": "/table/form/13/form-type/FORM_4/OPER/null/2026",
"rows": 110,
"owner": "rf"
},
{
"form_id": 13,
"form_type": "FORM_4",
"sheet": "STRUCTURE",
"direction": null,
"year": 2026,
"url": "/table/form/13/form-type/FORM_4/STRUCTURE/null/2026",
"rows": 775,
"owner": "rf"
},
{
"form_id": 13,
"form_type": "FORM_4",
"sheet": "SMETA",
"direction": null,
"year": 2026,
"url": "/table/form/13/form-type/FORM_4/SMETA/null/2026",
"rows": 109,
"owner": "rf"
}
],
"project_reports": [
{
"project_id": 1,
"year": 2026,
"report_type": "LIMIT",
"url": "/table/form/1/form-type/PROJECT/LIMIT/null/2026",
"rows": 1364
},
{
"project_id": 1,
"year": 2026,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/1/form-type/PROJECT/CURRENT_EXPENSES/null/2026",
"rows": 1364
},
{
"project_id": 4,
"year": 2026,
"report_type": "LIMIT",
"url": "/table/form/4/form-type/PROJECT/LIMIT/null/2026",
"rows": 1364
},
{
"project_id": 3,
"year": 2026,
"report_type": "LIMIT",
"url": "/table/form/3/form-type/PROJECT/LIMIT/null/2026",
"rows": 1364
},
{
"project_id": 2,
"year": 2026,
"report_type": "LIMIT",
"url": "/table/form/2/form-type/PROJECT/LIMIT/null/2026",
"rows": 1364
},
{
"project_id": 3,
"year": 2026,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/3/form-type/PROJECT/CURRENT_EXPENSES/null/2026",
"rows": 1364
},
{
"project_id": 2,
"year": 2026,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/2/form-type/PROJECT/CURRENT_EXPENSES/null/2026",
"rows": 1364
},
{
"project_id": 4,
"year": 2026,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/4/form-type/PROJECT/CURRENT_EXPENSES/null/2026",
"rows": 1364
},
{
"project_id": 2,
"year": 2027,
"report_type": "LIMIT",
"url": "/table/form/2/form-type/PROJECT/LIMIT/null/2027",
"rows": 1364
},
{
"project_id": 4,
"year": 2027,
"report_type": "LIMIT",
"url": "/table/form/4/form-type/PROJECT/LIMIT/null/2027",
"rows": 1364
},
{
"project_id": 2,
"year": 2027,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/2/form-type/PROJECT/CURRENT_EXPENSES/null/2027",
"rows": 1364
},
{
"project_id": 4,
"year": 2027,
"report_type": "CURRENT_EXPENSES",
"url": "/table/form/4/form-type/PROJECT/CURRENT_EXPENSES/null/2027",
"rows": 1364
}
],
"svods": [
{
"name": "svod1_MAIN",
"url": "/svod#MAIN"
},
{
"name": "svod1_FORM_1",
"url": "/svod#FORM_1"
},
{
"name": "svod1_FORM_2",
"url": "/svod#FORM_2"
},
{
"name": "svod1_FORM_3",
"url": "/svod#FORM_3"
},
{
"name": "svod1_FORM_4",
"url": "/svod#FORM_4"
},
{
"name": "svod2_GO",
"url": "/svod/2#GO"
},
{
"name": "svod2_RF",
"url": "/svod/2#RF"
},
{
"name": "svods_navigator",
"url": "/svods-navigator"
},
{
"name": "projects_summaries",
"url": "/projects/summaries"
}
],
"modal_pages": [
{
"name": "tasks",
"url": "/tasks"
},
{
"name": "projects",
"url": "/projects"
},
{
"name": "task_ssp_form_1",
"url": "/task/1"
},
{
"name": "task_ssp_form_2",
"url": "/task/4"
},
{
"name": "task_rf_form_2",
"url": "/task/7"
},
{
"name": "task_rf_form_4",
"url": "/task/13"
},
{
"name": "project_card",
"url": "/project/1"
},
{
"name": "admin_users",
"url": "/admin_panel/users"
},
{
"name": "admin_ssps",
"url": "/admin_panel/ssps"
},
{
"name": "admin_default_stage",
"url": "/admin_panel/default-stage"
},
{
"name": "admin_audit_log",
"url": "/admin_panel/audit-log"
},
{
"name": "dict_vsp",
"url": "/dicts/dict-vsp"
},
{
"name": "dicts_navigator",
"url": "/dicts-navigator"
}
]
}

View File

@ -0,0 +1,48 @@
# Перечень модалок
Источник: `perf/e2e/modals.json` (поиск по `web/src`: `common/Modal`, emotion-модалки `ModalBackdrop`, MUI `Dialog`/`Modal`/`Popover`).
priority 1 - листы форм, задача, проект, проекты, задачи; priority 2 - админка и справочник ВСП.
| id | страница | source | priority | роль | открытие | статус | n | медиана, мс | skip_reason |
|---|---|---|---|---|---|---|---|---|---|
| `sheet_select_vsp` | sheet | `web/src/components/RealtimeTable/Modals/SelectVspModal.jsx:51` | 1 | rf | `button[aria-label="Добавить строку"]` | not_run | 0 | | |
| `sheet_select_vsp@big` | sheet | `web/src/components/RealtimeTable/Modals/SelectVspModal.jsx:51` | 1 | rf | `button[aria-label="Добавить строку"]` | measured | 1 | 229 | |
| `sheet_select_expense` | sheet | `web/src/components/RealtimeTable/Modals/SelectExpenseItemModal.jsx:51` | 1 | rf | `button[aria-label="Добавить строку"]` (+1 шаг.) | not_run | 0 | | |
| `sheet_select_expense@big` | sheet | `web/src/components/RealtimeTable/Modals/SelectExpenseItemModal.jsx:51` | 1 | rf | `button[aria-label="Добавить строку"]` (+1 шаг.) | not_run | 0 | | |
| `sheet_create_program` | sheet | `web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38` | 1 | rf | `button[aria-label="Добавить программу"]` | not_run | 0 | | |
| `sheet_create_program@big` | sheet | `web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38` | 1 | rf | `button[aria-label="Добавить программу"]` | not_run | 0 | | |
| `sheet_create_project` | sheet | `web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38` | 1 | rf | `button[aria-label="Добавить проект"]` (+1 шаг.) | not_run | 0 | | |
| `sheet_create_project@big` | sheet | `web/src/components/RealtimeTable/Modals/CreateProgramProjectModal.jsx:38` | 1 | rf | `button[aria-label="Добавить проект"]` (+1 шаг.) | not_run | 0 | | |
| `sheet_columns_tree` | sheet | `web/src/components/common/CollapsibleTree.jsx:203` | 1 | rf | `[data-pin-panel] input[readonly]` | not_run | 0 | | |
| `sheet_columns_tree@big` | sheet | `web/src/components/common/CollapsibleTree.jsx:203` | 1 | rf | `[data-pin-panel] input[readonly]` | not_run | 0 | | |
| `task_stages` | task | `web/src/components/Stages/SettingModal.jsx:102` | 1 | rf | `role=button[name="Этапы"]` | not_run | 0 | | |
| `task_stage_add` | task | `web/src/components/Stages/AddStagesModal.jsx:156` | 1 | admin | `role=button[name="Добавить этап"]` (+1 шаг.) | not_run | 0 | | |
| `task_stage_edit` | task | `web/src/components/Stages/AddStagesModal.jsx:156` | 1 | admin | `role=menuitem[name="Редактировать"]` (+2 шаг.) | not_run | 0 | | |
| `project_stages` | project | `web/src/components/Stages/SettingModal.jsx:102` | 1 | rf | `role=button[name="Этапы"] >> nth=0` | not_run | 0 | | |
| `project_add_year` | project | `web/src/pages/TaskPage/TaskPage.jsx:217` | 1 | rf | `role=button[name="Добавить год"]` | not_run | 0 | | |
| `project_stage_delete` | project | `web/src/components/Stages/DeleteStageModal.jsx:38` | 1 | admin | `role=menuitem[name="Удалить"]` (+2 шаг.) | not_run | 0 | | |
| `projects_create` | projects | `web/src/pages/ProjectsPage/ModalCreateProject.jsx:247` | 1 | rf | `role=button[name="Создать проект"]` | not_run | 0 | | |
| `projects_edit` | projects | `web/src/pages/ProjectPages/components/EditModal/EditModal.jsx:170` | 1 | rf | `role=button[name="Редактировать"] >> nth=0` | not_run | 0 | | |
| `projects_delete` | projects | `web/src/pages/ProjectPages/NavigationProjectPage.jsx:510` | 1 | rf | `role=button[name="Удалить проект"] >> nth=0` | not_run | 0 | | |
| `tasks_create` | tasks | `web/src/pages/TasksPage/TasksPage.jsx:374` | 1 | admin | `role=button[name="Создать задачу"]` | not_run | 0 | | |
| `tasks_confirm_mark` | tasks | `web/src/pages/TasksPage/TasksTable.jsx:371` | 1 | admin | `text=Отправить на удаление` (+1 шаг.) | not_run | 0 | | |
| `forms_create` | forms | `web/src/pages/FormsPage.jsx:133` | 1 | admin | | skip | 0 | | страница FormsPage не подключена в app/Routes.jsx - открыть из UI нельзя |
| `taskcard_confirm` | forms | `web/src/components/common/TaskCardComponent.jsx:265` | 1 | admin | | skip | 0 | | TaskCardComponent используется только в FormsPage (не в маршрутах) |
| `infoheader_rename` | forms | `web/src/pages/TableTempPage/InfoForHeader.jsx:44` | 1 | admin | | skip | 0 | | TableTempPage не в маршрутах, ModalRename не импортирован - мёртвый код |
| `admin_users_add` | admin_users | `web/src/pages/AdminPanel/UsersPage/ModalAddUsers.jsx:71` | 2 | admin | `role=button[name="Добавить"]` | not_run | 0 | | |
| `admin_users_edit` | admin_users | `web/src/pages/AdminPanel/UsersPage/UserTable/EditUserModal.jsx:311` | 2 | admin | `role=menuitem[name="Редактировать"]` (+1 шаг.) | not_run | 0 | | |
| `admin_users_delete` | admin_users | `web/src/pages/AdminPanel/UsersPage/UserTable/DeleteUserModal.jsx:48` | 2 | admin | `role=menuitem[name="Удалить"]` (+1 шаг.) | not_run | 0 | | |
| `admin_users_ssp` | admin_users | `web/src/pages/AdminPanel/UsersPage/ModalEditUserSsp.jsx:93` | 2 | admin | `tbody button:has-text("Выбрать") >> nth=0` | not_run | 0 | | |
| `admin_ssps_add` | admin_ssps | `web/src/pages/AdminPanel/SppsPage/ModalAddSsp.jsx:51` | 2 | admin | `role=button[name="Добавить"]` | not_run | 0 | | |
| `admin_ssps_edit` | admin_ssps | `web/src/pages/AdminPanel/SppsPage/ModalEditSsp.jsx:41` | 2 | admin | `tbody tr >> nth=0 >> button >> nth=-1` | not_run | 0 | | |
| `admin_ssps_users` | admin_ssps | `web/src/pages/AdminPanel/SppsPage/ModalChangeUsersInSsp.jsx:121` | 2 | admin | `tbody tr >> nth=0 >> button >> nth=0` | not_run | 0 | | |
| `admin_ssps_archive` | admin_ssps | `web/src/pages/AdminPanel/SppsPage/ModalConfirmArchiveSsp.jsx:27` | 2 | admin | `tbody tr >> nth=0 >> button:has-text("Активен")` | not_run | 0 | | |
| `admin_phase_add` | admin_default_stage | `web/src/pages/AdminPanel/PhaseTemplatesPage/components/PhaseTemplateDialog.jsx:120` | 2 | admin | `role=button[name="Добавить этап"]` | not_run | 0 | | |
| `admin_phase_edit` | admin_default_stage | `web/src/pages/AdminPanel/PhaseTemplatesPage/components/PhaseTemplateDialog.jsx:120` | 2 | admin | `role=button[name^="Редактировать этап"] >> nth=0` | not_run | 0 | | |
| `admin_phase_delete` | admin_default_stage | `web/src/pages/AdminPanel/PhaseTemplatesPage/components/DeletePhaseTemplateDialog.jsx:8` | 2 | admin | `role=button[name^="Удалить этап"] >> nth=0` | not_run | 0 | | |
| `admin_audit_json` | admin_audit_log | `web/src/pages/AdminPanel/AuditLogsPage/components/JsonViewModal.jsx:95` | 2 | admin | `text=Посмотреть >> nth=0` | not_run | 0 | | |
| `dict_vsp_add` | dict_vsp | `web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx:239` | 2 | admin | `role=button[name="+ Добавить объект"]` | not_run | 0 | | |
| `dict_vsp_edit` | dict_vsp | `web/src/pages/DictVspPage/components/Modals/ModalEditAddVsp.jsx:239` | 2 | admin | `tbody tr >> nth=0 >> button >> nth=-1` | not_run | 0 | | |
| `dict_vsp_export` | dict_vsp | `web/src/pages/DictVspPage/components/Modals/ModalExport.jsx:71` | 2 | admin | `role=button[name="Экспортировать"]` | not_run | 0 | | |
Всего: 39, без skip_reason: 36, skip_reason: 3.

View File

@ -0,0 +1,22 @@
{
"run_id": "20261026-control-s1",
"scale": 1,
"steps": {
"control4x": {
"status": "OK",
"rc": 0,
"start": "2026-10-26T12:26:46+0400",
"end": "2026-10-26T12:59:48+0400",
"duration_s": 1982,
"cmd": "rc=0; ( cd '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/e2e' && env -u PERF_TARGETS -u PERF_REPEATS -u PERF_CPU_RATES -u PERF_ROLES -u PERF_AXES -u PERF_MODALS -u PERF_PRIORITY -u PERF_PROFILING -u PERF_SQLSTATS_TAG -u PERF_SQLSTATS -u PERF_COAUTHOR_RATES -u PERF_TRACE -u PERF_RESULTS_DIR -u PERF_MEM_CYCLES -u PERF_MEM_SNAPSHOTS PERF_SCALE=1 PERF_RUN_ID=20261026-control-s1 PERF_WEB=http://localhost:8080 PERF_SQLSTATS_TAG=control4x_scroll PERF_CPU_RATES=4 PERF_REPEATS=1 PERF_TRACE=0 PERF_ROLES=rf,dfip PERF_TARGETS='FORM_2/AHR/null@y,svod/svod1_MAIN,svod/svod2_GO' npx playwright test scenarios/scroll.spec.ts ) || rc=$?; ( cd '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/e2e' && env -u PERF_TARGETS -u PERF_REPEATS -u PERF_CPU_RATES -u PERF_ROLES -u PERF_AXES -u PERF_MODALS -u PERF_PRIORITY -u PERF_PROFILING -u PERF_SQLSTATS_TAG -u PERF_SQLSTATS -u PERF_COAUTHOR_RATES -u PERF_TRACE -u PERF_RESULTS_DIR -u PERF_MEM_CYCLES -u PERF_MEM_SNAPSHOTS PERF_SCALE=1 PERF_RUN_ID=20261026-control-s1 PERF_WEB=http://localhost:8080 PERF_SQLSTATS_TAG=control4x_modals PERF_CPU_RATES=4 PERF_REPEATS=1 PERF_TRACE=0 PERF_PRIORITY=1,2 PERF_MODALS='sheet_select_vsp@big' npx playwright test scenarios/modals.spec.ts ) || rc=$?; exit $rc"
},
"aggregate": {
"status": "OK",
"rc": 0,
"start": "2026-10-26T12:59:48+0400",
"end": "2026-10-26T12:59:48+0400",
"duration_s": 0,
"cmd": "cd '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf' && rm -f '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/summary.json' && '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/.venv/bin/python' -m perfkit.aggregate 'results/20261026-control-s1' && { [ ! -f 'results/20261026-control-s1/modal.jsonl' ] || '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/.venv/bin/python' -m perfkit.modals_inventory 'results/20261026-control-s1'; } && mkdir -p '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1' && for d in results/20261026-control-s1/sql/*/; do if [ -d \"$d\" ]; then t=$(basename \"$d\"); mkdir -p '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/sql/'$t || exit 1; if [ -f \"$d\"sql_top.json ]; then cp \"$d\"sql_top.json '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/sql/'$t/ || exit 1; fi; if [ -d \"$d\"explain ]; then cp -R \"$d\"explain '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/sql/'$t/ || exit 1; fi; fi; done && for f in results/20261026-control-s1/memtrend.txt results/manifest-s1.json results/gen-stats-s1.json results/grow-s1.json results/20261026-control-s1/run-all.status.json; do if [ -f \"$f\" ]; then cp \"$f\" '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/' || exit 1; fi; done && ls -R '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1' && test -f '/Users/andrey.epifancev/projects/fomichev_claude/DFiP_Budget_planing/.claude/worktrees/perf-profiling/perf/report-data/20261026-control-s1/summary.json'"
}
}
}

View File

@ -0,0 +1,62 @@
{
"query": "SELECT row_type, depth, sort_order, data \n FROM v3.v_form_view($1, $2, $3)",
"calls": 1,
"total_exec_time": 17.892,
"mean_exec_time": 17.892,
"mode": "analyze",
"analyze": true,
"params": [
7,
"AHR",
null
],
"param_source": {
"method": "GET",
"url": "http://localhost:8080/api/v1/form/7/sheet/AHR",
"role": "rf"
},
"plan": [
{
"Plan": {
"Node Type": "Function Scan",
"Parallel Aware": false,
"Async Capable": false,
"Function Name": "v_form_view",
"Alias": "v_form_view",
"Startup Cost": 0.25,
"Total Cost": 10.25,
"Plan Rows": 1000,
"Plan Width": 76,
"Actual Startup Time": 598.134,
"Actual Total Time": 599.026,
"Actual Rows": 2092,
"Actual Loops": 1,
"Shared Hit Blocks": 55124,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 3246,
"Temp Written Blocks": 3270
},
"Planning": {
"Shared Hit Blocks": 0,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning Time": 0.017,
"Triggers": [],
"Execution Time": 600.4
}
]
}

View File

@ -0,0 +1,38 @@
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.username = $1::VARCHAR \n LIMIT $2::INTEGER",
"calls": 7,
"total_exec_time": 1.739,
"mean_exec_time": 0.248,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Limit",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 0.0,
"Total Cost": 7.81,
"Plan Rows": 1,
"Plan Width": 153,
"Plans": [
{
"Node Type": "Seq Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Relation Name": "app_user",
"Alias": "app_user",
"Startup Cost": 0.0,
"Total Cost": 15.62,
"Plan Rows": 2,
"Plan Width": 153,
"Filter": "((username)::text = ($1)::text)"
}
]
}
}
]
}

View File

@ -0,0 +1,108 @@
{
"query": "SELECT app_user_1.id AS app_user_1_id, v3.org_unit.id AS v3_org_unit_id, v3.org_unit.title AS v3_org_unit_title, v3.org_unit.is_active AS v3_org_unit_is_active, v3.org_unit.is_ssp AS v3_org_unit_is_ssp, v3.org_unit.utc_offset AS v3_org_unit_utc_offset \nFROM v3.app_user AS app_user_1 JOIN v3.user_org AS user_org_1 ON app_user_1.id = user_org_1.user_id JOIN v3.org_unit ON v3.org_unit.id = user_org_1.org_unit_id \nWHERE app_user_1.id IN ($1::INTEGER)",
"calls": 3,
"total_exec_time": 0.985,
"mean_exec_time": 0.328,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Nested Loop",
"Parallel Aware": false,
"Async Capable": false,
"Join Type": "Inner",
"Startup Cost": 15.06,
"Total Cost": 45.69,
"Plan Rows": 10,
"Plan Width": 58,
"Inner Unique": false,
"Plans": [
{
"Node Type": "Index Only Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Scan Direction": "Forward",
"Index Name": "app_user_pkey",
"Relation Name": "app_user",
"Alias": "app_user_1",
"Startup Cost": 0.15,
"Total Cost": 8.17,
"Plan Rows": 1,
"Plan Width": 4,
"Index Cond": "(id = $1)"
},
{
"Node Type": "Hash Join",
"Parent Relationship": "Inner",
"Parallel Aware": false,
"Async Capable": false,
"Join Type": "Inner",
"Startup Cost": 14.91,
"Total Cost": 37.42,
"Plan Rows": 10,
"Plan Width": 58,
"Inner Unique": true,
"Hash Cond": "(org_unit.id = user_org_1.org_unit_id)",
"Plans": [
{
"Node Type": "Seq Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Relation Name": "org_unit",
"Alias": "org_unit",
"Startup Cost": 0.0,
"Total Cost": 19.9,
"Plan Rows": 990,
"Plan Width": 54
},
{
"Node Type": "Hash",
"Parent Relationship": "Inner",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 14.79,
"Total Cost": 14.79,
"Plan Rows": 10,
"Plan Width": 8,
"Plans": [
{
"Node Type": "Bitmap Heap Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Relation Name": "user_org",
"Alias": "user_org_1",
"Startup Cost": 4.23,
"Total Cost": 14.79,
"Plan Rows": 10,
"Plan Width": 8,
"Recheck Cond": "(user_id = $1)",
"Plans": [
{
"Node Type": "Bitmap Index Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Index Name": "user_org_user_id_org_unit_id_key",
"Startup Cost": 0.0,
"Total Cost": 4.23,
"Plan Rows": 10,
"Plan Width": 0,
"Index Cond": "(user_id = $1)"
}
]
}
]
}
]
}
]
}
}
]
}

View File

@ -0,0 +1,40 @@
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.id = $1::INTEGER \n LIMIT $2::INTEGER",
"calls": 3,
"total_exec_time": 0.377,
"mean_exec_time": 0.126,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Limit",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 0.15,
"Total Cost": 8.17,
"Plan Rows": 1,
"Plan Width": 153,
"Plans": [
{
"Node Type": "Index Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Scan Direction": "Forward",
"Index Name": "app_user_pkey",
"Relation Name": "app_user",
"Alias": "app_user",
"Startup Cost": 0.15,
"Total Cost": 8.17,
"Plan Rows": 1,
"Plan Width": 153,
"Index Cond": "(id = $1)"
}
]
}
}
]
}

View File

@ -0,0 +1,53 @@
{
"query": "SELECT count(*) OVER () AS total_count, v3.vsp.id, v3.vsp.branch_id, v3.vsp.reg_number, v3.vsp.address, v3.vsp.format, v3.vsp.opened_at, v3.vsp.placement_type, v3.vsp.staff_count, v3.vsp.total_area, v3.vsp.closed_at, v3.vsp.is_active, v3.vsp.is_deleted, v3.vsp.system_code, v3.vsp.created_at, v3.vsp.updated_at, v3.vsp.created_by, v3.vsp.updated_by, v3.vsp.vsp_type, v3.vsp.notes, v3.vsp.rent_contract_num, v3.vsp.rent_end_date \nFROM v3.vsp \nWHERE v3.vsp.is_deleted IS false AND v3.vsp.is_active = true AND v3.vsp.branch_id IN ($1::INTEGER) ORDER BY v3.vsp.id",
"calls": 1,
"total_exec_time": 0.328,
"mean_exec_time": 0.328,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Sort",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 12.36,
"Total Cost": 12.44,
"Plan Rows": 30,
"Plan Width": 439,
"Sort Key": [
"id"
],
"Plans": [
{
"Node Type": "WindowAgg",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 0.0,
"Total Cost": 11.62,
"Plan Rows": 30,
"Plan Width": 439,
"Plans": [
{
"Node Type": "Seq Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Relation Name": "vsp",
"Alias": "vsp",
"Startup Cost": 0.0,
"Total Cost": 11.25,
"Plan Rows": 30,
"Plan Width": 431,
"Filter": "((is_deleted IS FALSE) AND is_active AND (branch_id = $1))"
}
]
}
]
}
}
]
}

View File

@ -0,0 +1,306 @@
{
"by_total": [
{
"query": "SELECT row_type, depth, sort_order, data \n FROM v3.v_form_view($1, $2, $3)",
"calls": 1,
"total_exec_time": 17.892,
"mean_exec_time": 17.892,
"rows": 500,
"shared_blks_hit": 1420,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT * FROM v3.v_form2_view(p_form_id, p_sheet, p_sections)",
"calls": 1,
"total_exec_time": 13.006,
"mean_exec_time": 13.006,
"rows": 499,
"shared_blks_hit": 1400,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT\n $2::VARCHAR,\n $3,\n ROW_NUMBER() OVER (ORDER BY ud.id) AS sort_order,\n jsonb_build_object(\n $4, ud.id,\n $5, ud.line_id,\n $6, ud.vsp_id,\n $7, v.address,\n $8, v.format,\n $9, v.total_area,\n $10, ud.contract_number,\n $11,ud.contract_end_date,\n $12, jsonb_build_object($13, ud.plan_q1, $14, ud.plan_q2, $15, ud.plan_q3, $16, ud.plan_q4,\n $17, COALESCE(ud.plan_q1,$18)+COALESCE(ud.plan_q2,$19)+COALESCE(ud.plan_q3,$20)+COALESCE(ud.plan_q4,$21)),\n $22, jsonb_build_object($23, ud.actual_jan, $24, ud.actual_feb, $25, ud.actual_mar,\n $26, COALESCE(ud.actual_jan,$27)+COALESCE(ud.actual_feb,$28)+COALESCE(ud.actual_mar,$29)),\n $30, jsonb_build_object($31, ud.actual_apr, $32, ud.actual_may, $33, ud.actual_jun,\n $34, COALESCE(ud.actual_apr,$35)+COALESCE(ud.actual_may,$36)+COALESCE(ud.actual_jun,$37)),\n $38, jsonb_build_object($39, ud.actual_jul, $40, ud.actual_aug, $41, ud.actual_sep,\n $42, COALESCE(ud.actual_jul,$43)+COALESCE(ud.actual_aug,$44)+COALESCE(ud.actual_sep,$45)),\n $46, jsonb_build_object($47, ud.actual_oct, $48, ud.actual_nov, $49, ud.actual_dec,\n $50, COALESCE(ud.actual_oct,$51)+COALESCE(ud.actual_nov,$52)+COALESCE(ud.actual_dec,$53)),\n $54, ud.comment\n )\n FROM v3.utility_detail ud\n JOIN v3.budget_line bl ON bl.id = ud.line_id\n JOIN v3.vsp v ON v.id = ud.vsp_id\n WHERE bl.budget_form_id = p_form_id\n ORDER BY ud.id",
"calls": 1,
"total_exec_time": 11.13,
"mean_exec_time": 11.13,
"rows": 499,
"shared_blks_hit": 1322,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.username = $1::VARCHAR \n LIMIT $2::INTEGER",
"calls": 7,
"total_exec_time": 1.739,
"mean_exec_time": 0.248,
"rows": 7,
"shared_blks_hit": 7,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT\n 'META'::VARCHAR,\n -1,\n 0::BIGINT,\n jsonb_build_object(\n 'user_id', v_user_id,\n 'role', v3.user_role_code(v_user_id),\n 'sheet', p_sheet,\n 'editable', COALESCE(\n (SELECT jsonb_agg(\n jsonb_build_object('column', ec.column_key,\n 'closes_at', ec.closes_at)\n ORDER BY ec.column_key)\n FROM v3.editable_columns_for(p_form_id, v_user_id, p_sheet, p_direction) ec),\n '[]'::JSONB)\n )",
"calls": 1,
"total_exec_time": 1.247,
"mean_exec_time": 1.247,
"rows": 1,
"shared_blks_hit": 18,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT app_user_1.id AS app_user_1_id, v3.org_unit.id AS v3_org_unit_id, v3.org_unit.title AS v3_org_unit_title, v3.org_unit.is_active AS v3_org_unit_is_active, v3.org_unit.is_ssp AS v3_org_unit_is_ssp, v3.org_unit.utc_offset AS v3_org_unit_utc_offset \nFROM v3.app_user AS app_user_1 JOIN v3.user_org AS user_org_1 ON app_user_1.id = user_org_1.user_id JOIN v3.org_unit ON v3.org_unit.id = user_org_1.org_unit_id \nWHERE app_user_1.id IN ($1::INTEGER)",
"calls": 3,
"total_exec_time": 0.985,
"mean_exec_time": 0.328,
"rows": 3,
"shared_blks_hit": 15,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.id = $1::INTEGER \n LIMIT $2::INTEGER",
"calls": 3,
"total_exec_time": 0.377,
"mean_exec_time": 0.126,
"rows": 3,
"shared_blks_hit": 6,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT count(*) OVER () AS total_count, v3.vsp.id, v3.vsp.branch_id, v3.vsp.reg_number, v3.vsp.address, v3.vsp.format, v3.vsp.opened_at, v3.vsp.placement_type, v3.vsp.staff_count, v3.vsp.total_area, v3.vsp.closed_at, v3.vsp.is_active, v3.vsp.is_deleted, v3.vsp.system_code, v3.vsp.created_at, v3.vsp.updated_at, v3.vsp.created_by, v3.vsp.updated_by, v3.vsp.vsp_type, v3.vsp.notes, v3.vsp.rent_contract_num, v3.vsp.rent_end_date \nFROM v3.vsp \nWHERE v3.vsp.is_deleted IS false AND v3.vsp.is_active = true AND v3.vsp.branch_id IN ($1::INTEGER) ORDER BY v3.vsp.id",
"calls": 1,
"total_exec_time": 0.328,
"mean_exec_time": 0.328,
"rows": 30,
"shared_blks_hit": 9,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.export_job.id, v3.export_job.user_id, v3.export_job.request, v3.export_job.status, v3.export_job.created_at, v3.export_job.started_at, v3.export_job.finished_at, v3.export_job.filename, v3.export_job.media_type, v3.export_job.file_path, v3.export_job.error \nFROM v3.export_job \nWHERE v3.export_job.user_id = $1::INTEGER AND (v3.export_job.finished_at IS NULL OR v3.export_job.finished_at > $2::TIMESTAMP WITH TIME ZONE) ORDER BY v3.export_job.created_at DESC",
"calls": 2,
"total_exec_time": 0.239,
"mean_exec_time": 0.12,
"rows": 0,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.budget_form.id, v3.budget_form.form_type_code, v3.budget_form.year, v3.budget_form.created_by, v3.budget_form.created_at, v3.budget_form.updated_by, v3.budget_form.updated_at, v3.budget_form.org_unit_id, v3.budget_form.to_delete, v3.budget_form.deleted_by, v3.budget_form.deleted_at, form_type_1.code, form_type_1.name, form_type_1.scope, form_type_1.storage_entity \nFROM v3.budget_form LEFT OUTER JOIN v3.form_type AS form_type_1 ON form_type_1.code = v3.budget_form.form_type_code \nWHERE v3.budget_form.id = $1::INTEGER AND v3.budget_form.org_unit_id IN ($2::INTEGER) AND v3.budget_form.to_delete IS false",
"calls": 1,
"total_exec_time": 0.144,
"mean_exec_time": 0.144,
"rows": 1,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT r.code\n FROM v3.app_user u\n JOIN v3.role r ON r.id = u.role_id\n WHERE u.id = p_user_id\n AND u.is_active",
"calls": 2,
"total_exec_time": 0.085,
"mean_exec_time": 0.043,
"rows": 2,
"shared_blks_hit": 8,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT v3.user_org.org_unit_id \nFROM v3.user_org \nWHERE v3.user_org.user_id = $1::INTEGER",
"calls": 1,
"total_exec_time": 0.063,
"mean_exec_time": 0.063,
"rows": 1,
"shared_blks_hit": 2,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "COMMIT",
"calls": 8,
"total_exec_time": 0.047,
"mean_exec_time": 0.006,
"rows": 0,
"shared_blks_hit": 0,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT ck AS column_key,\n MAX(fp.closes_at) AS closes_at\n FROM v3.form_phase fp,\n LATERAL unnest(fp.column_keys) AS ck\n WHERE fp.budget_form_id = p_form_id\n AND fp.sheet = p_sheet\n AND (fp.direction = p_direction OR (fp.direction IS NULL AND p_direction IS NULL))\n AND fp.role = v_role\n AND now() BETWEEN fp.opens_at AND fp.closes_at\n GROUP BY ck",
"calls": 1,
"total_exec_time": 0.035,
"mean_exec_time": 0.035,
"rows": 4,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT v3.budget_form.id, v3.budget_form.form_type_code, v3.budget_form.year, v3.budget_form.created_by, v3.budget_form.created_at, v3.budget_form.updated_by, v3.budget_form.updated_at, v3.budget_form.org_unit_id, v3.budget_form.to_delete, v3.budget_form.deleted_by, v3.budget_form.deleted_at, org_unit_1.id AS id_1, org_unit_1.title, org_unit_1.is_active, org_unit_1.is_ssp, org_unit_1.utc_offset \nFROM v3.budget_form LEFT OUTER JOIN v3.org_unit AS org_unit_1 ON org_unit_1.id = v3.budget_form.org_unit_id \nWHERE v3.budget_form.id = $1::INTEGER AND v3.budget_form.org_unit_id IN ($2::INTEGER) AND v3.budget_form.to_delete IS false",
"calls": 1,
"total_exec_time": 0.035,
"mean_exec_time": 0.035,
"rows": 1,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
}
],
"by_mean": [
{
"query": "SELECT row_type, depth, sort_order, data \n FROM v3.v_form_view($1, $2, $3)",
"calls": 1,
"total_exec_time": 17.892,
"mean_exec_time": 17.892,
"rows": 500,
"shared_blks_hit": 1420,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT * FROM v3.v_form2_view(p_form_id, p_sheet, p_sections)",
"calls": 1,
"total_exec_time": 13.006,
"mean_exec_time": 13.006,
"rows": 499,
"shared_blks_hit": 1400,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT\n $2::VARCHAR,\n $3,\n ROW_NUMBER() OVER (ORDER BY ud.id) AS sort_order,\n jsonb_build_object(\n $4, ud.id,\n $5, ud.line_id,\n $6, ud.vsp_id,\n $7, v.address,\n $8, v.format,\n $9, v.total_area,\n $10, ud.contract_number,\n $11,ud.contract_end_date,\n $12, jsonb_build_object($13, ud.plan_q1, $14, ud.plan_q2, $15, ud.plan_q3, $16, ud.plan_q4,\n $17, COALESCE(ud.plan_q1,$18)+COALESCE(ud.plan_q2,$19)+COALESCE(ud.plan_q3,$20)+COALESCE(ud.plan_q4,$21)),\n $22, jsonb_build_object($23, ud.actual_jan, $24, ud.actual_feb, $25, ud.actual_mar,\n $26, COALESCE(ud.actual_jan,$27)+COALESCE(ud.actual_feb,$28)+COALESCE(ud.actual_mar,$29)),\n $30, jsonb_build_object($31, ud.actual_apr, $32, ud.actual_may, $33, ud.actual_jun,\n $34, COALESCE(ud.actual_apr,$35)+COALESCE(ud.actual_may,$36)+COALESCE(ud.actual_jun,$37)),\n $38, jsonb_build_object($39, ud.actual_jul, $40, ud.actual_aug, $41, ud.actual_sep,\n $42, COALESCE(ud.actual_jul,$43)+COALESCE(ud.actual_aug,$44)+COALESCE(ud.actual_sep,$45)),\n $46, jsonb_build_object($47, ud.actual_oct, $48, ud.actual_nov, $49, ud.actual_dec,\n $50, COALESCE(ud.actual_oct,$51)+COALESCE(ud.actual_nov,$52)+COALESCE(ud.actual_dec,$53)),\n $54, ud.comment\n )\n FROM v3.utility_detail ud\n JOIN v3.budget_line bl ON bl.id = ud.line_id\n JOIN v3.vsp v ON v.id = ud.vsp_id\n WHERE bl.budget_form_id = p_form_id\n ORDER BY ud.id",
"calls": 1,
"total_exec_time": 11.13,
"mean_exec_time": 11.13,
"rows": 499,
"shared_blks_hit": 1322,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT\n 'META'::VARCHAR,\n -1,\n 0::BIGINT,\n jsonb_build_object(\n 'user_id', v_user_id,\n 'role', v3.user_role_code(v_user_id),\n 'sheet', p_sheet,\n 'editable', COALESCE(\n (SELECT jsonb_agg(\n jsonb_build_object('column', ec.column_key,\n 'closes_at', ec.closes_at)\n ORDER BY ec.column_key)\n FROM v3.editable_columns_for(p_form_id, v_user_id, p_sheet, p_direction) ec),\n '[]'::JSONB)\n )",
"calls": 1,
"total_exec_time": 1.247,
"mean_exec_time": 1.247,
"rows": 1,
"shared_blks_hit": 18,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT app_user_1.id AS app_user_1_id, v3.org_unit.id AS v3_org_unit_id, v3.org_unit.title AS v3_org_unit_title, v3.org_unit.is_active AS v3_org_unit_is_active, v3.org_unit.is_ssp AS v3_org_unit_is_ssp, v3.org_unit.utc_offset AS v3_org_unit_utc_offset \nFROM v3.app_user AS app_user_1 JOIN v3.user_org AS user_org_1 ON app_user_1.id = user_org_1.user_id JOIN v3.org_unit ON v3.org_unit.id = user_org_1.org_unit_id \nWHERE app_user_1.id IN ($1::INTEGER)",
"calls": 3,
"total_exec_time": 0.985,
"mean_exec_time": 0.328,
"rows": 3,
"shared_blks_hit": 15,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT count(*) OVER () AS total_count, v3.vsp.id, v3.vsp.branch_id, v3.vsp.reg_number, v3.vsp.address, v3.vsp.format, v3.vsp.opened_at, v3.vsp.placement_type, v3.vsp.staff_count, v3.vsp.total_area, v3.vsp.closed_at, v3.vsp.is_active, v3.vsp.is_deleted, v3.vsp.system_code, v3.vsp.created_at, v3.vsp.updated_at, v3.vsp.created_by, v3.vsp.updated_by, v3.vsp.vsp_type, v3.vsp.notes, v3.vsp.rent_contract_num, v3.vsp.rent_end_date \nFROM v3.vsp \nWHERE v3.vsp.is_deleted IS false AND v3.vsp.is_active = true AND v3.vsp.branch_id IN ($1::INTEGER) ORDER BY v3.vsp.id",
"calls": 1,
"total_exec_time": 0.328,
"mean_exec_time": 0.328,
"rows": 30,
"shared_blks_hit": 9,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.username = $1::VARCHAR \n LIMIT $2::INTEGER",
"calls": 7,
"total_exec_time": 1.739,
"mean_exec_time": 0.248,
"rows": 7,
"shared_blks_hit": 7,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.budget_form.id, v3.budget_form.form_type_code, v3.budget_form.year, v3.budget_form.created_by, v3.budget_form.created_at, v3.budget_form.updated_by, v3.budget_form.updated_at, v3.budget_form.org_unit_id, v3.budget_form.to_delete, v3.budget_form.deleted_by, v3.budget_form.deleted_at, form_type_1.code, form_type_1.name, form_type_1.scope, form_type_1.storage_entity \nFROM v3.budget_form LEFT OUTER JOIN v3.form_type AS form_type_1 ON form_type_1.code = v3.budget_form.form_type_code \nWHERE v3.budget_form.id = $1::INTEGER AND v3.budget_form.org_unit_id IN ($2::INTEGER) AND v3.budget_form.to_delete IS false",
"calls": 1,
"total_exec_time": 0.144,
"mean_exec_time": 0.144,
"rows": 1,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.id = $1::INTEGER \n LIMIT $2::INTEGER",
"calls": 3,
"total_exec_time": 0.377,
"mean_exec_time": 0.126,
"rows": 3,
"shared_blks_hit": 6,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.export_job.id, v3.export_job.user_id, v3.export_job.request, v3.export_job.status, v3.export_job.created_at, v3.export_job.started_at, v3.export_job.finished_at, v3.export_job.filename, v3.export_job.media_type, v3.export_job.file_path, v3.export_job.error \nFROM v3.export_job \nWHERE v3.export_job.user_id = $1::INTEGER AND (v3.export_job.finished_at IS NULL OR v3.export_job.finished_at > $2::TIMESTAMP WITH TIME ZONE) ORDER BY v3.export_job.created_at DESC",
"calls": 2,
"total_exec_time": 0.239,
"mean_exec_time": 0.12,
"rows": 0,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.user_org.org_unit_id \nFROM v3.user_org \nWHERE v3.user_org.user_id = $1::INTEGER",
"calls": 1,
"total_exec_time": 0.063,
"mean_exec_time": 0.063,
"rows": 1,
"shared_blks_hit": 2,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT r.code\n FROM v3.app_user u\n JOIN v3.role r ON r.id = u.role_id\n WHERE u.id = p_user_id\n AND u.is_active",
"calls": 2,
"total_exec_time": 0.085,
"mean_exec_time": 0.043,
"rows": 2,
"shared_blks_hit": 8,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT ck AS column_key,\n MAX(fp.closes_at) AS closes_at\n FROM v3.form_phase fp,\n LATERAL unnest(fp.column_keys) AS ck\n WHERE fp.budget_form_id = p_form_id\n AND fp.sheet = p_sheet\n AND (fp.direction = p_direction OR (fp.direction IS NULL AND p_direction IS NULL))\n AND fp.role = v_role\n AND now() BETWEEN fp.opens_at AND fp.closes_at\n GROUP BY ck",
"calls": 1,
"total_exec_time": 0.035,
"mean_exec_time": 0.035,
"rows": 4,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": false
},
{
"query": "SELECT v3.budget_form.id, v3.budget_form.form_type_code, v3.budget_form.year, v3.budget_form.created_by, v3.budget_form.created_at, v3.budget_form.updated_by, v3.budget_form.updated_at, v3.budget_form.org_unit_id, v3.budget_form.to_delete, v3.budget_form.deleted_by, v3.budget_form.deleted_at, org_unit_1.id AS id_1, org_unit_1.title, org_unit_1.is_active, org_unit_1.is_ssp, org_unit_1.utc_offset \nFROM v3.budget_form LEFT OUTER JOIN v3.org_unit AS org_unit_1 ON org_unit_1.id = v3.budget_form.org_unit_id \nWHERE v3.budget_form.id = $1::INTEGER AND v3.budget_form.org_unit_id IN ($2::INTEGER) AND v3.budget_form.to_delete IS false",
"calls": 1,
"total_exec_time": 0.035,
"mean_exec_time": 0.035,
"rows": 1,
"shared_blks_hit": 4,
"shared_blks_read": 0,
"toplevel": true
},
{
"query": "SELECT v3.budget_form.id, v3.budget_form.form_type_code, v3.budget_form.year, v3.budget_form.created_by, v3.budget_form.created_at, v3.budget_form.updated_by, v3.budget_form.updated_at, v3.budget_form.org_unit_id, v3.budget_form.to_delete, v3.budget_form.deleted_by, v3.budget_form.deleted_at \nFROM v3.budget_form \nWHERE v3.budget_form.id = $1::INTEGER AND v3.budget_form.to_delete IS false",
"calls": 1,
"total_exec_time": 0.026,
"mean_exec_time": 0.026,
"rows": 1,
"shared_blks_hit": 2,
"shared_blks_read": 0,
"toplevel": true
}
]
}

View File

@ -0,0 +1,25 @@
{
"query": "SELECT\n 'INPUT'::VARCHAR AS row_type,\n 3 AS depth,\n sort_order,\n data\n FROM v3.v_svod2_go(\n CAST($1 AS INT),\n CAST($2 AS INT[]),\n CAST($3 AS INT),\n CAST($4 AS INT),\n CAST($5 AS VARCHAR),\n CAST($6 AS VARCHAR)\n )",
"calls": 2,
"total_exec_time": 1473.004,
"mean_exec_time": 736.502,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Function Scan",
"Parallel Aware": false,
"Async Capable": false,
"Function Name": "v_svod2_go",
"Alias": "v_svod2_go",
"Startup Cost": 0.25,
"Total Cost": 10.25,
"Plan Rows": 1000,
"Plan Width": 76
}
}
]
}

View File

@ -0,0 +1,62 @@
{
"query": "SELECT row_type, depth, sort_order, data \n FROM v3.v_form_view($1, $2, $3)",
"calls": 2,
"total_exec_time": 1457.271,
"mean_exec_time": 728.636,
"mode": "analyze",
"analyze": true,
"params": [
7,
"AHR",
null
],
"param_source": {
"method": "GET",
"url": "http://localhost:8080/api/v1/form/7/sheet/AHR",
"role": "rf"
},
"plan": [
{
"Plan": {
"Node Type": "Function Scan",
"Parallel Aware": false,
"Async Capable": false,
"Function Name": "v_form_view",
"Alias": "v_form_view",
"Startup Cost": 0.25,
"Total Cost": 10.25,
"Plan Rows": 1000,
"Plan Width": 76,
"Actual Startup Time": 594.19,
"Actual Total Time": 595.17,
"Actual Rows": 2092,
"Actual Loops": 1,
"Shared Hit Blocks": 55112,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 3246,
"Temp Written Blocks": 3270
},
"Planning": {
"Shared Hit Blocks": 0,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning Time": 0.014,
"Triggers": [],
"Execution Time": 596.929
}
]
}

View File

@ -0,0 +1,62 @@
{
"query": "SELECT row_type, depth, sort_order, data\n FROM v3.v_summary_view(\n CAST($1 AS INT),\n CAST($2 AS TEXT),\n CAST($3 AS INT[])\n )",
"calls": 2,
"total_exec_time": 675.087,
"mean_exec_time": 337.544,
"mode": "analyze",
"analyze": true,
"params": [
2026,
"MAIN",
null
],
"param_source": {
"method": "GET",
"url": "http://localhost:8080/api/v1/svod/1/MAIN/2026",
"role": "dfip"
},
"plan": [
{
"Plan": {
"Node Type": "Function Scan",
"Parallel Aware": false,
"Async Capable": false,
"Function Name": "v_summary_view",
"Alias": "v_summary_view",
"Startup Cost": 0.25,
"Total Cost": 10.25,
"Plan Rows": 1000,
"Plan Width": 76,
"Actual Startup Time": 274.47,
"Actual Total Time": 274.475,
"Actual Rows": 133,
"Actual Loops": 1,
"Shared Hit Blocks": 470717,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning": {
"Shared Hit Blocks": 0,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning Time": 0.007,
"Triggers": [],
"Execution Time": 274.517
}
]
}

View File

@ -0,0 +1,29 @@
{
"query": "SELECT v3.export_job.id, v3.export_job.user_id, v3.export_job.request, v3.export_job.status, v3.export_job.created_at, v3.export_job.started_at, v3.export_job.finished_at, v3.export_job.filename, v3.export_job.media_type, v3.export_job.file_path, v3.export_job.error \nFROM v3.export_job \nWHERE v3.export_job.user_id = $1::INTEGER AND (v3.export_job.finished_at IS NULL OR v3.export_job.finished_at > $2::TIMESTAMP WITH TIME ZONE) ORDER BY v3.export_job.created_at DESC",
"calls": 205,
"total_exec_time": 52.671,
"mean_exec_time": 0.257,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Index Scan",
"Parallel Aware": false,
"Async Capable": false,
"Scan Direction": "Backward",
"Index Name": "export_job_user",
"Relation Name": "export_job",
"Alias": "export_job",
"Startup Cost": 0.15,
"Total Cost": 8.17,
"Plan Rows": 1,
"Plan Width": 262,
"Index Cond": "(user_id = $1)",
"Filter": "((finished_at IS NULL) OR (finished_at > $2))"
}
}
]
}

View File

@ -0,0 +1,38 @@
{
"query": "SELECT v3.app_user.id, v3.app_user.email, v3.app_user.username, v3.app_user.hashed_password, v3.app_user.full_name, v3.app_user.role_id, v3.app_user.is_active, v3.app_user.created_at, v3.app_user.updated_at \nFROM v3.app_user \nWHERE v3.app_user.username = $1::VARCHAR \n LIMIT $2::INTEGER",
"calls": 25,
"total_exec_time": 4.187,
"mean_exec_time": 0.167,
"mode": "generic_plan",
"analyze": false,
"params": null,
"param_source": null,
"plan": [
{
"Plan": {
"Node Type": "Limit",
"Parallel Aware": false,
"Async Capable": false,
"Startup Cost": 0.0,
"Total Cost": 7.81,
"Plan Rows": 1,
"Plan Width": 153,
"Plans": [
{
"Node Type": "Seq Scan",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Async Capable": false,
"Relation Name": "app_user",
"Alias": "app_user",
"Startup Cost": 0.0,
"Total Cost": 15.62,
"Plan Rows": 2,
"Plan Width": 153,
"Filter": "((username)::text = ($1)::text)"
}
]
}
}
]
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,517 @@
{
"run_id": "20261026-control-s1",
"groups": [
{
"scenario": "modal",
"target": "sheet_select_vsp@big",
"role": "rf",
"scale": 1,
"cpu_rate": 4,
"n": 1,
"incomplete_n": 0,
"traced_n": 0,
"metrics": {
"main_thread_ms": {
"median": 242.58599999999998,
"p95": 242.58599999999998,
"min": 242.58599999999998,
"max": 242.58599999999998,
"n": 1
},
"click_to_visible_ms": {
"median": 228.60000002384186,
"p95": 228.60000002384186,
"min": 228.60000002384186,
"max": 228.60000002384186,
"n": 1
},
"long_task_ms": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
},
"long_task_n": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
}
}
},
{
"scenario": "scroll",
"target": "FORM_2/AHR/null@y",
"role": "rf",
"scale": 1,
"cpu_rate": 4,
"n": 1,
"incomplete_n": 0,
"traced_n": 0,
"metrics": {
"main_thread_ms_per_step": {
"median": 349.7567992788461,
"p95": 349.7567992788461,
"min": 349.7567992788461,
"max": 349.7567992788461,
"n": 1
},
"main_thread_ms": {
"median": 290997.65699999995,
"p95": 290997.65699999995,
"min": 290997.65699999995,
"max": 290997.65699999995,
"n": 1
},
"axis": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
},
"duration_ms": {
"median": 295401,
"p95": 295401,
"min": 295401,
"max": 295401,
"n": 1
},
"frame_excess_ms": {
"median": 250498.53333334342,
"p95": 250498.53333334342,
"min": 250498.53333334342,
"max": 250498.53333334342,
"n": 1
},
"frame_n": {
"median": 2695,
"p95": 2695,
"min": 2695,
"max": 2695,
"n": 1
},
"frame_p50_ms": {
"median": 100,
"p95": 100,
"min": 100,
"max": 100,
"n": 1
},
"frame_p95_ms": {
"median": 266.6999999999971,
"p95": 266.6999999999971,
"min": 266.6999999999971,
"max": 266.6999999999971,
"n": 1
},
"heavy_frame_n": {
"median": 1665,
"p95": 1665,
"min": 1665,
"max": 1665,
"n": 1
},
"json_bytes_sheet": {
"median": 7597621,
"p95": 7597621,
"min": 7597621,
"max": 7597621,
"n": 1
},
"long_task_ms": {
"median": 275153,
"p95": 275153,
"min": 275153,
"max": 275153,
"n": 1
},
"long_task_n": {
"median": 1665,
"p95": 1665,
"min": 1665,
"max": 1665,
"n": 1
},
"rows_visible_after": {
"median": 24,
"p95": 24,
"min": 24,
"max": 24,
"n": 1
},
"rows_visible_before": {
"median": 24,
"p95": 24,
"min": 24,
"max": 24,
"n": 1
},
"steps": {
"median": 832,
"p95": 832,
"min": 832,
"max": 832,
"n": 1
}
}
},
{
"scenario": "scroll",
"target": "svod/svod1_MAIN/filter@y",
"role": "dfip",
"scale": 1,
"cpu_rate": 4,
"n": 1,
"incomplete_n": 0,
"traced_n": 0,
"metrics": {
"main_thread_ms": {
"median": 367.58500000000004,
"p95": 367.58500000000004,
"min": 367.58500000000004,
"max": 367.58500000000004,
"n": 1
},
"axis": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
},
"duration_ms": {
"median": 779.7000000476837,
"p95": 779.7000000476837,
"min": 779.7000000476837,
"max": 779.7000000476837,
"n": 1
},
"frame_excess_ms": {
"median": 217.33333333333383,
"p95": 217.33333333333383,
"min": 217.33333333333383,
"max": 217.33333333333383,
"n": 1
},
"frame_n": {
"median": 33,
"p95": 33,
"min": 33,
"max": 33,
"n": 1
},
"frame_p50_ms": {
"median": 16.700000000000045,
"p95": 16.700000000000045,
"min": 16.700000000000045,
"max": 16.700000000000045,
"n": 1
},
"frame_p95_ms": {
"median": 16.700000000000045,
"p95": 16.700000000000045,
"min": 16.700000000000045,
"max": 16.700000000000045,
"n": 1
},
"heavy_frame_n": {
"median": 1,
"p95": 1,
"min": 1,
"max": 1,
"n": 1
},
"json_bytes_sheet": {
"median": 133662,
"p95": 133662,
"min": 133662,
"max": 133662,
"n": 1
},
"long_task_ms": {
"median": 252,
"p95": 252,
"min": 252,
"max": 252,
"n": 1
},
"long_task_n": {
"median": 1,
"p95": 1,
"min": 1,
"max": 1,
"n": 1
},
"rows_visible_after": {
"median": 32,
"p95": 32,
"min": 32,
"max": 32,
"n": 1
},
"rows_visible_before": {
"median": 32,
"p95": 32,
"min": 32,
"max": 32,
"n": 1
},
"steps": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
}
}
},
{
"scenario": "scroll",
"target": "svod/svod1_MAIN@y",
"role": "dfip",
"scale": 1,
"cpu_rate": 4,
"n": 1,
"incomplete_n": 0,
"traced_n": 0,
"metrics": {
"main_thread_ms_per_step": {
"median": 555.1213529411765,
"p95": 555.1213529411765,
"min": 555.1213529411765,
"max": 555.1213529411765,
"n": 1
},
"main_thread_ms": {
"median": 18874.126,
"p95": 18874.126,
"min": 18874.126,
"max": 18874.126,
"n": 1
},
"axis": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
},
"duration_ms": {
"median": 19606.300000071526,
"p95": 19606.300000071526,
"min": 19606.300000071526,
"max": 19606.300000071526,
"n": 1
},
"frame_excess_ms": {
"median": 17035.03333333335,
"p95": 17035.03333333335,
"min": 17035.03333333335,
"max": 17035.03333333335,
"n": 1
},
"frame_n": {
"median": 154,
"p95": 154,
"min": 154,
"max": 154,
"n": 1
},
"frame_p50_ms": {
"median": 16.700000000000728,
"p95": 16.700000000000728,
"min": 16.700000000000728,
"max": 16.700000000000728,
"n": 1
},
"frame_p95_ms": {
"median": 483.39999999999964,
"p95": 483.39999999999964,
"min": 483.39999999999964,
"max": 483.39999999999964,
"n": 1
},
"heavy_frame_n": {
"median": 68,
"p95": 68,
"min": 68,
"max": 68,
"n": 1
},
"json_bytes_sheet": {
"median": 133662,
"p95": 133662,
"min": 133662,
"max": 133662,
"n": 1
},
"long_task_ms": {
"median": 18269,
"p95": 18269,
"min": 18269,
"max": 18269,
"n": 1
},
"long_task_n": {
"median": 68,
"p95": 68,
"min": 68,
"max": 68,
"n": 1
},
"rows_visible_after": {
"median": 32,
"p95": 32,
"min": 32,
"max": 32,
"n": 1
},
"rows_visible_before": {
"median": 32,
"p95": 32,
"min": 32,
"max": 32,
"n": 1
},
"steps": {
"median": 34,
"p95": 34,
"min": 34,
"max": 34,
"n": 1
}
}
},
{
"scenario": "scroll",
"target": "svod/svod2_GO/filter@y",
"role": "dfip",
"scale": 1,
"cpu_rate": 4,
"n": 0,
"incomplete_n": 1,
"traced_n": 0,
"metrics": {}
},
{
"scenario": "scroll",
"target": "svod/svod2_GO@y",
"role": "dfip",
"scale": 1,
"cpu_rate": 4,
"n": 1,
"incomplete_n": 0,
"traced_n": 0,
"metrics": {
"main_thread_ms_per_step": {
"median": 728.5520126582279,
"p95": 728.5520126582279,
"min": 728.5520126582279,
"max": 728.5520126582279,
"n": 1
},
"main_thread_ms": {
"median": 1496445.834,
"p95": 1496445.834,
"min": 1496445.834,
"max": 1496445.834,
"n": 1
},
"axis": {
"median": 0,
"p95": 0,
"min": 0,
"max": 0,
"n": 1
},
"duration_ms": {
"median": 1528210.7000000477,
"p95": 1528210.7000000477,
"min": 1528210.7000000477,
"max": 1528210.7000000477,
"n": 1
},
"frame_excess_ms": {
"median": 1387566.0999999552,
"p95": 1387566.0999999552,
"min": 1387566.0999999552,
"max": 1387566.0999999552,
"n": 1
},
"frame_n": {
"median": 8444,
"p95": 8444,
"min": 8444,
"max": 8444,
"n": 1
},
"frame_p50_ms": {
"median": 16.800000000046566,
"p95": 16.800000000046566,
"min": 16.800000000046566,
"max": 16.800000000046566,
"n": 1
},
"frame_p95_ms": {
"median": 466.69999999995343,
"p95": 466.69999999995343,
"min": 466.69999999995343,
"max": 466.69999999995343,
"n": 1
},
"heavy_frame_n": {
"median": 4131,
"p95": 4131,
"min": 4131,
"max": 4131,
"n": 1
},
"json_bytes_sheet": {
"median": 30613848,
"p95": 30613848,
"min": 30613848,
"max": 30613848,
"n": 1
},
"long_task_ms": {
"median": 1453916,
"p95": 1453916,
"min": 1453916,
"max": 1453916,
"n": 1
},
"long_task_n": {
"median": 4109,
"p95": 4109,
"min": 4109,
"max": 4109,
"n": 1
},
"rows_visible_after": {
"median": 27,
"p95": 27,
"min": 27,
"max": 27,
"n": 1
},
"rows_visible_before": {
"median": 27,
"p95": 27,
"min": 27,
"max": 27,
"n": 1
},
"steps": {
"median": 2054,
"p95": 2054,
"min": 2054,
"max": 2054,
"n": 1
}
}
}
]
}

View File

@ -0,0 +1,106 @@
# Summary: 20261026-control-s1
## modal | target=sheet_select_vsp@big | role=rf | scale=1 | cpu_rate=4
Замеров: 1, незавершённых: 0
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
| main_thread_ms | 242.6 | 242.6 | 242.6 | 242.6 | 1 |
| click_to_visible_ms | 228.6 | 228.6 | 228.6 | 228.6 | 1 |
| long_task_ms | 0 | 0 | 0 | 0 | 1 |
| long_task_n | 0 | 0 | 0 | 0 | 1 |
## scroll | target=FORM_2/AHR/null@y | role=rf | scale=1 | cpu_rate=4
Замеров: 1, незавершённых: 0
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
| main_thread_ms_per_step | 349.8 | 349.8 | 349.8 | 349.8 | 1 |
| main_thread_ms | 290997.7 | 290997.7 | 290997.7 | 290997.7 | 1 |
| axis | 0 | 0 | 0 | 0 | 1 |
| duration_ms | 295401 | 295401 | 295401 | 295401 | 1 |
| frame_excess_ms | 250498.5 | 250498.5 | 250498.5 | 250498.5 | 1 |
| frame_n | 2695 | 2695 | 2695 | 2695 | 1 |
| frame_p50_ms | 100 | 100 | 100 | 100 | 1 |
| frame_p95_ms | 266.7 | 266.7 | 266.7 | 266.7 | 1 |
| heavy_frame_n | 1665 | 1665 | 1665 | 1665 | 1 |
| json_bytes_sheet | 7597621 | 7597621 | 7597621 | 7597621 | 1 |
| long_task_ms | 275153 | 275153 | 275153 | 275153 | 1 |
| long_task_n | 1665 | 1665 | 1665 | 1665 | 1 |
| rows_visible_after | 24 | 24 | 24 | 24 | 1 |
| rows_visible_before | 24 | 24 | 24 | 24 | 1 |
| steps | 832 | 832 | 832 | 832 | 1 |
## scroll | target=svod/svod1_MAIN/filter@y | role=dfip | scale=1 | cpu_rate=4
Замеров: 1, незавершённых: 0
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
| main_thread_ms | 367.6 | 367.6 | 367.6 | 367.6 | 1 |
| axis | 0 | 0 | 0 | 0 | 1 |
| duration_ms | 779.7 | 779.7 | 779.7 | 779.7 | 1 |
| frame_excess_ms | 217.3 | 217.3 | 217.3 | 217.3 | 1 |
| frame_n | 33 | 33 | 33 | 33 | 1 |
| frame_p50_ms | 16.7 | 16.7 | 16.7 | 16.7 | 1 |
| frame_p95_ms | 16.7 | 16.7 | 16.7 | 16.7 | 1 |
| heavy_frame_n | 1 | 1 | 1 | 1 | 1 |
| json_bytes_sheet | 133662 | 133662 | 133662 | 133662 | 1 |
| long_task_ms | 252 | 252 | 252 | 252 | 1 |
| long_task_n | 1 | 1 | 1 | 1 | 1 |
| rows_visible_after | 32 | 32 | 32 | 32 | 1 |
| rows_visible_before | 32 | 32 | 32 | 32 | 1 |
| steps | 0 | 0 | 0 | 0 | 1 |
## scroll | target=svod/svod1_MAIN@y | role=dfip | scale=1 | cpu_rate=4
Замеров: 1, незавершённых: 0
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
| main_thread_ms_per_step | 555.1 | 555.1 | 555.1 | 555.1 | 1 |
| main_thread_ms | 18874.1 | 18874.1 | 18874.1 | 18874.1 | 1 |
| axis | 0 | 0 | 0 | 0 | 1 |
| duration_ms | 19606.3 | 19606.3 | 19606.3 | 19606.3 | 1 |
| frame_excess_ms | 17035.0 | 17035.0 | 17035.0 | 17035.0 | 1 |
| frame_n | 154 | 154 | 154 | 154 | 1 |
| frame_p50_ms | 16.7 | 16.7 | 16.7 | 16.7 | 1 |
| frame_p95_ms | 483.4 | 483.4 | 483.4 | 483.4 | 1 |
| heavy_frame_n | 68 | 68 | 68 | 68 | 1 |
| json_bytes_sheet | 133662 | 133662 | 133662 | 133662 | 1 |
| long_task_ms | 18269 | 18269 | 18269 | 18269 | 1 |
| long_task_n | 68 | 68 | 68 | 68 | 1 |
| rows_visible_after | 32 | 32 | 32 | 32 | 1 |
| rows_visible_before | 32 | 32 | 32 | 32 | 1 |
| steps | 34 | 34 | 34 | 34 | 1 |
## scroll | target=svod/svod2_GO/filter@y | role=dfip | scale=1 | cpu_rate=4
Замеров: 0, незавершённых: 1
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
## scroll | target=svod/svod2_GO@y | role=dfip | scale=1 | cpu_rate=4
Замеров: 1, незавершённых: 0
| metric | median | p95 | min | max | n |
|---|---|---|---|---|---|
| main_thread_ms_per_step | 728.6 | 728.6 | 728.6 | 728.6 | 1 |
| main_thread_ms | 1496445.8 | 1496445.8 | 1496445.8 | 1496445.8 | 1 |
| axis | 0 | 0 | 0 | 0 | 1 |
| duration_ms | 1528210.7 | 1528210.7 | 1528210.7 | 1528210.7 | 1 |
| frame_excess_ms | 1387566.1 | 1387566.1 | 1387566.1 | 1387566.1 | 1 |
| frame_n | 8444 | 8444 | 8444 | 8444 | 1 |
| frame_p50_ms | 16.8 | 16.8 | 16.8 | 16.8 | 1 |
| frame_p95_ms | 466.7 | 466.7 | 466.7 | 466.7 | 1 |
| heavy_frame_n | 4131 | 4131 | 4131 | 4131 | 1 |
| json_bytes_sheet | 30613848 | 30613848 | 30613848 | 30613848 | 1 |
| long_task_ms | 1453916 | 1453916 | 1453916 | 1453916 | 1 |
| long_task_n | 4109 | 4109 | 4109 | 4109 | 1 |
| rows_visible_after | 27 | 27 | 27 | 27 | 1 |
| rows_visible_before | 27 | 27 | 27 | 27 | 1 |
| steps | 2054 | 2054 | 2054 | 2054 | 1 |

View File

@ -0,0 +1,106 @@
[
{
"role": "rf",
"request": "лист FORM_2/AHR (2092 строк ответа)",
"rows": 2092,
"path": "/api/v1/form/7/sheet/AHR",
"total_ms": 813.0,
"db_ms": 725.6,
"bytes": 7597621,
"content_encoding": "gzip",
"python_ms": 87.4,
"python_share": 0.11,
"ratio_total_db": 1.12
},
{
"role": "rf",
"request": "лист FORM_4/CAP (300 строк ответа)",
"rows": 300,
"path": "/api/v1/form/13/sheet/CAP",
"total_ms": 1757.4,
"db_ms": 1732.4,
"bytes": 1149057,
"content_encoding": "gzip",
"python_ms": 25.0,
"python_share": 0.01,
"ratio_total_db": 1.01
},
{
"role": "rf",
"request": "лист FORM_4/AHR (110 строк ответа)",
"rows": 110,
"path": "/api/v1/form/13/sheet/AHR",
"total_ms": 642.8,
"db_ms": 622.8,
"bytes": 441964,
"content_encoding": "gzip",
"python_ms": 20.0,
"python_share": 0.03,
"ratio_total_db": 1.03
},
{
"role": "rf",
"request": "отчёт проекта LIMIT (1364 строк ответа)",
"rows": 1364,
"path": "/api/v1/projects/1/report/2026/LIMIT",
"total_ms": 343.3,
"db_ms": 307.1,
"bytes": 1484827,
"content_encoding": "gzip",
"python_ms": 36.2,
"python_share": 0.11,
"ratio_total_db": 1.12
},
{
"role": "dfip",
"request": "свод 1 MAIN (133 строк ответа)",
"rows": 133,
"path": "/api/v1/svod/1/MAIN/2026",
"total_ms": 301.3,
"db_ms": 287.9,
"bytes": 133662,
"content_encoding": "gzip",
"python_ms": 13.4,
"python_share": 0.04,
"ratio_total_db": 1.05
},
{
"role": "dfip",
"request": "свод 2 GO (все организации) (5563 строк ответа)",
"rows": 5563,
"path": "/api/v1/svod/2/GO/2026",
"total_ms": 1056.5,
"db_ms": 717.5,
"bytes": 30613848,
"content_encoding": "gzip",
"python_ms": 339.0,
"python_share": 0.32,
"ratio_total_db": 1.47
},
{
"role": "dfip",
"request": "свод 2 RF (все организации) (9497 строк ответа)",
"rows": 9497,
"path": "/api/v1/svod/2/RF/2026",
"total_ms": 1807.6,
"db_ms": 1229.2,
"bytes": 52017143,
"content_encoding": "gzip",
"python_ms": 578.4,
"python_share": 0.32,
"ratio_total_db": 1.47
},
{
"role": "dfip",
"request": "сводные проектов (747 строк ответа)",
"rows": 747,
"path": "/api/v1/projects/plan-summary?year=2026",
"total_ms": 331.6,
"db_ms": 301.2,
"bytes": 493530,
"content_encoding": "gzip",
"python_ms": 30.4,
"python_share": 0.09,
"ratio_total_db": 1.1
}
]

View File

@ -0,0 +1,12 @@
# API: БД против Python (api_split.py, масштаб 1, медиана 10 повторов после прогрева, напрямую :8000)
| запрос | роль | полное, мс | X-DB-Time-Ms | остаток (Python + передача), мс | доля остатка | полное / БД | размер, МБ | Content-Encoding |
|---|---|---|---|---|---|---|---|---|
| лист FORM_2/AHR (2092 строк ответа) | rf | 813.0 | 725.6 | 87.4 | 0.11 | 1.12 | 7.60 | gzip |
| лист FORM_4/CAP (300 строк ответа) | rf | 1757.4 | 1732.4 | 25.0 | 0.01 | 1.01 | 1.15 | gzip |
| лист FORM_4/AHR (110 строк ответа) | rf | 642.8 | 622.8 | 20.0 | 0.03 | 1.03 | 0.44 | gzip |
| отчёт проекта LIMIT (1364 строк ответа) | rf | 343.3 | 307.1 | 36.2 | 0.11 | 1.12 | 1.48 | gzip |
| свод 1 MAIN (133 строк ответа) | dfip | 301.3 | 287.9 | 13.4 | 0.04 | 1.05 | 0.13 | gzip |
| свод 2 GO (все организации) (5563 строк ответа) | dfip | 1056.5 | 717.5 | 339.0 | 0.32 | 1.47 | 30.61 | gzip |
| свод 2 RF (все организации) (9497 строк ответа) | dfip | 1807.6 | 1229.2 | 578.4 | 0.32 | 1.47 | 52.02 | gzip |
| сводные проектов (747 строк ответа) | dfip | 331.6 | 301.2 | 30.4 | 0.09 | 1.1 | 0.49 | gzip |

View File

@ -1275,6 +1275,544 @@
]
}
]
},
{
"target": "FORM_2/AHR/null:cssgrowth",
"cycles": [
{
"cycle": 0,
"css_rules": 2874,
"css_media_rules": 73,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
20
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
14
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
3
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
],
[
"@media (forced-colors: active) {\n .css-* { border: Npx solid buttonborder; }\n}",
2
]
],
"matchmedia_calls": 0,
"matchmedia_listeners_net": 0,
"matchmedia_top": []
},
{
"cycle": 1,
"scroll_ms_per_step": 75.4,
"css_rules": 3454,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 2,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
2
]
]
},
{
"cycle": 2,
"scroll_ms_per_step": 75.9,
"css_rules": 3471,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 4,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
4
]
]
},
{
"cycle": 3,
"scroll_ms_per_step": 78.3,
"css_rules": 3476,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 6,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
6
]
]
},
{
"cycle": 4,
"scroll_ms_per_step": 79,
"css_rules": 3482,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 8,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
8
]
]
},
{
"cycle": 5,
"scroll_ms_per_step": 77,
"css_rules": 3490,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 10,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
10
]
]
},
{
"cycle": 6,
"scroll_ms_per_step": 77.5,
"css_rules": 3497,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 12,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
12
]
]
},
{
"cycle": 7,
"scroll_ms_per_step": 77.5,
"css_rules": 3500,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 14,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
14
]
]
},
{
"cycle": 8,
"scroll_ms_per_step": 78.2,
"css_rules": 3501,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 16,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
16
]
]
},
{
"cycle": 9,
"scroll_ms_per_step": 79.3,
"css_rules": 3504,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 18,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
18
]
]
},
{
"cycle": 10,
"scroll_ms_per_step": 77.1,
"css_rules": 3505,
"css_media_rules": 102,
"style_elements": 5,
"media_shapes_last400": [
[
"@media (hover: none) {\n .css-*:hover { background-color: transparent; }\n}",
28
],
[
"@media print {\n .css-* { print-color-adjust: exact; }\n}",
21
],
[
"@media (hover: hover) {\n .css-*:hover { --variant-containedBg: rgb(25, 90, 45); --variant-textBg: rgba(37, 129, 65, 0.04); --variant-outlinedBorder: #258141; --variant-outlinedBg: rgba(37, 129, 65, 0.04); }\n}",
8
],
[
"@media (hover: none) {\n .css-*:hover .MuiOutlinedInput-notchedOutline { border-color: rgba(0, 0, 0, 0.23); }\n}",
6
],
[
"@media (min-width: Npx) {\n .\\!container { max-width: Npx !important; }\n .container { max-width: Npx; }\n}",
5
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container { width: 100vw; left: env(safe-area-inset-left); margin: Npx; }\n .Toastify__toast-container--top-left, .Toastify__toast-container--top-center, .To",
2
],
[
"@media only screen and (max-width: Npx) {\n .Toastify__toast-container[data-stacked=\"true\"] { width: 100vw; }\n}",
2
],
[
"@media (pointer: coarse) {\n .css-* { top: Npx; }\n}",
2
]
],
"matchmedia_calls": 20,
"matchmedia_listeners_net": 0,
"matchmedia_top": [
[
"(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)",
20
]
]
}
]
}
],
"modal": [

View File

@ -41,7 +41,7 @@
| cpu | svod/svod2_RF:filter | 743 | 1796 | 1 | 20 | 1 (139 мс) | attributes:tbody.MuiTableBody-root@class ×1 | коммитов / |
| cpu | svod/svod1_MAIN:filter | 601 | 1800 | 1 | 20 | 1 (71 мс) | attributes:tbody.MuiTableBody-root@class ×1 | коммитов / |
## Рост CSS-правил и matchMedia по циклам: FORM_2/AHR/null:cssgrowth
## Рост CSS-правил и matchMedia по циклам: FORM_2/AHR/null:cssgrowth (цикл AHR -> скролл 40 шагов -> /tasks)
| цикл | main thread/шаг, мс | CSS-правил | @media | style | вызовов matchMedia | нетто listeners matchMedia |
|---|---|---|---|---|---|---|
@ -62,6 +62,26 @@
| 14 | 76.7 | 3249 | 96 | 5 | | |
| 15 | 78.1 | 3249 | 96 | 5 | | |
## Рост CSS-правил и matchMedia по циклам: FORM_2/AHR/null:cssgrowth (цикл AHR -> скролл -> /tasks -> второй лист -> скролл -> /tasks, со счётчиком matchMedia)
| цикл | main thread/шаг, мс | CSS-правил | @media | style | вызовов matchMedia | нетто listeners matchMedia |
|---|---|---|---|---|---|---|
| 0 | | 2874 | 73 | 5 | 0 | 0 |
| 1 | 75.4 | 3454 | 102 | 5 | 2 | 0 |
| 2 | 75.9 | 3471 | 102 | 5 | 4 | 0 |
| 3 | 78.3 | 3476 | 102 | 5 | 6 | 0 |
| 4 | 79 | 3482 | 102 | 5 | 8 | 0 |
| 5 | 77 | 3490 | 102 | 5 | 10 | 0 |
| 6 | 77.5 | 3497 | 102 | 5 | 12 | 0 |
| 7 | 77.5 | 3500 | 102 | 5 | 14 | 0 |
| 8 | 78.2 | 3501 | 102 | 5 | 16 | 0 |
| 9 | 79.3 | 3504 | 102 | 5 | 18 | 0 |
| 10 | 77.1 | 3505 | 102 | 5 | 20 | 0 |
Топ мест вызова matchMedia (последний цикл, нарастающим итогом):
- 20 × `(max-width:720px) @ at static/js/408_script.6797a7e7.js:162:21515 < at Object.useMemo (static/js/lib-react_script.73464df3.js:2:64779) < at n.useMemo (static/js/lib-react_script.73464df3.js:2:135509)`
## Модалки (повтор на восстановленных данных)
| модалка | роль | клик → кадр, мс | main thread, мс |

View File

@ -0,0 +1,807 @@
{
"react": [],
"cpu": [],
"filter": [],
"cssgrowth": [],
"modal": [],
"modal_renders": [
{
"target": "sheet_select_vsp",
"commits": 14,
"renders": 6684,
"self_ms": 30.9,
"top": [
[
"ForwardRef(Styled(td))",
473,
7.6
],
[
"ForwardRef(Styled(Component))",
392,
2.4
],
[
"ForwardRef(Styled(div))",
361,
2.1
],
[
"ForwardRef(Tooltip)",
123,
1.4
],
[
"ForwardRef(Styled(button))",
131,
1.3
],
[
"MRT_TableBodyCellValue",
384,
1.0
]
]
},
{
"target": "sheet_select_vsp@big",
"commits": 14,
"renders": 6632,
"self_ms": 31.0,
"top": [
[
"ForwardRef(Styled(td))",
472,
8.2
],
[
"ForwardRef(Styled(div))",
356,
2.6
],
[
"ForwardRef(Styled(Component))",
389,
2
],
[
"ForwardRef(Styled(button))",
130,
1.5
],
[
"ForwardRef(Tooltip)",
122,
1.5
],
[
"ForwardRef(ButtonBase)",
130,
1.4
]
]
},
{
"target": "sheet_select_expense",
"commits": 13,
"renders": 6841,
"self_ms": 34.0,
"top": [
[
"ForwardRef(Styled(td))",
539,
10.7
],
[
"MRT_Table",
1,
2.3
],
[
"ForwardRef(Styled(Component))",
403,
1.9
],
[
"ForwardRef(Styled(div))",
336,
1.7
],
[
"ForwardRef(ButtonBase)",
137,
1.5
],
[
"ForwardRef(Tooltip)",
123,
1.3
]
]
},
{
"target": "sheet_select_expense@big",
"commits": 13,
"renders": 6841,
"self_ms": 32.6,
"top": [
[
"ForwardRef(Styled(td))",
539,
8.5
],
[
"MRT_Table",
1,
2.7
],
[
"ForwardRef(Styled(div))",
336,
2.1
],
[
"ForwardRef(Styled(Component))",
403,
1.7
],
[
"MRT_TableBodyRow",
24,
1.6
],
[
"ForwardRef(Styled(button))",
137,
1.1
]
]
},
{
"target": "sheet_create_program",
"commits": 11,
"renders": 6670,
"self_ms": 36.4,
"top": [
[
"ForwardRef(Styled(td))",
539,
11.2
],
[
"ForwardRef(Styled(div))",
314,
2.9
],
[
"ForwardRef(Styled(Component))",
381,
2.6
],
[
"MRT_Table",
1,
2.5
],
[
"MRT_TableBodyRow",
24,
1.6
],
[
"ForwardRef(Tooltip)",
123,
1.4
]
]
},
{
"target": "sheet_create_program@big",
"commits": 11,
"renders": 6670,
"self_ms": 28.7,
"top": [
[
"ForwardRef(Styled(td))",
539,
6.8
],
[
"ForwardRef(Styled(Component))",
381,
2.4
],
[
"MRT_Table",
1,
2.1
],
[
"MRT_TableBodyRow",
24,
1.9
],
[
"ForwardRef(Styled(div))",
314,
1.7
],
[
"ForwardRef(Tooltip)",
123,
1.6
]
]
},
{
"target": "sheet_create_project",
"commits": 11,
"renders": 6670,
"self_ms": 39.3,
"top": [
[
"ForwardRef(Styled(td))",
539,
12.6
],
[
"MRT_Table",
1,
2.6
],
[
"ForwardRef(Styled(Component))",
381,
2.5
],
[
"MRT_TableBodyRow",
24,
1.8
],
[
"ForwardRef(Tooltip)",
123,
1.8
],
[
"ForwardRef(TableCell)",
539,
1.5
]
]
},
{
"target": "sheet_create_project@big",
"commits": 11,
"renders": 6670,
"self_ms": 28.2,
"top": [
[
"ForwardRef(Styled(td))",
539,
8.0
],
[
"ForwardRef(Tooltip)",
123,
4.3
],
[
"ForwardRef(Styled(Component))",
381,
1.8
],
[
"MRT_TableBodyRow",
24,
1.7
],
[
"MRT_Table",
1,
1.6
],
[
"MRT_TableBodyCell",
480,
0.9
]
]
},
{
"target": "sheet_columns_tree",
"commits": 8,
"renders": 940,
"self_ms": 16.0,
"top": [
[
"ForwardRef(TreeItem)",
24,
4
],
[
"ForwardRef(Styled(div))",
106,
2.1
],
[
"ForwardRef(SimpleTreeView)",
2,
2.0
],
[
"ForwardRef(Styled(Component))",
82,
1
],
[
"Transition",
30,
0.7
],
[
"ForwardRef(SwitchBase)",
13,
0.6
]
]
},
{
"target": "sheet_columns_tree@big",
"commits": 8,
"renders": 745,
"self_ms": 14.5,
"top": [
[
"ForwardRef(TreeItem)",
18,
4.0
],
[
"ForwardRef(SimpleTreeView)",
2,
2.2
],
[
"ForwardRef(Styled(div))",
85,
1.6
],
[
"ForwardRef(Styled(Component))",
64,
0.5
],
[
"ForwardRef(Checkbox)",
10,
0.5
],
[
"Insertion",
230,
0.5
]
]
},
{
"target": "task_stages",
"commits": 8,
"renders": 1375,
"self_ms": 13.0,
"top": [
[
"ForwardRef(Styled(div))",
134,
3.0
],
[
"ForwardRef(Styled(td))",
131,
1.1
],
[
"ForwardRef(Chip)",
24,
1
],
[
"ForwardRef(TouchRipple)",
5,
1
],
[
"StagesTable",
2,
0.7
],
[
"ForwardRef(Styled(span))",
131,
0.7
]
]
},
{
"target": "task_stage_add",
"commits": 10,
"renders": 1780,
"self_ms": 18.0,
"top": [
[
"ForwardRef(Styled(div))",
120,
2.8
],
[
"ForwardRef(Styled(td))",
125,
1.2
],
[
"ForwardRef(SelectInput)",
6,
1.2
],
[
"CalendarInput",
4,
1.1
],
[
"ForwardRef(Styled(Component))",
92,
1
],
[
"StageFormTheme",
2,
0.8
]
]
},
{
"target": "task_stage_edit",
"commits": 12,
"renders": 2277,
"self_ms": 20.9,
"top": [
[
"ForwardRef(Styled(div))",
183,
4.0
],
[
"ForwardRef(Styled(Component))",
123,
1.8
],
[
"ForwardRef(SelectInput)",
10,
1.4
],
[
"ForwardRef(Styled(span))",
129,
1
],
[
"CollapsibleTree",
1,
1
],
[
"ForwardRef(Styled(input))",
31,
0.8
]
]
},
{
"target": "project_stages",
"commits": 8,
"renders": 416,
"self_ms": 9.1,
"top": [
[
"ForwardRef(Styled(div))",
45,
1.4
],
[
"ForwardRef(TouchRipple)",
5,
1.1
],
[
"ForwardRef(Chip)",
3,
0.6
],
[
"ForwardRef(ButtonBase)",
5,
0.6
],
[
"StagesTable",
2,
0.5
],
[
"ForwardRef(TableCell)",
26,
0.5
]
]
},
{
"target": "project_add_year",
"commits": 6,
"renders": 194,
"self_ms": 3.7,
"top": [
[
"ForwardRef(TouchRipple)",
5,
0.8
],
[
"ForwardRef(Styled(div))",
30,
0.6
],
[
"ForwardRef(Styled(Component))",
14,
0.5
],
[
"ForwardRef(ButtonBase)",
7,
0.4
],
[
"ForwardRef(Styled(Ripple))",
3,
0.2
],
[
"Ripple",
3,
0.2
]
]
},
{
"target": "project_stage_delete",
"commits": 11,
"renders": 366,
"self_ms": 6.1,
"top": [
[
"ForwardRef(Styled(div))",
23,
0.8
],
[
"Transition",
6,
0.8
],
[
"ForwardRef(Styled(button))",
12,
0.6
],
[
"ForwardRef(ButtonBase)",
12,
0.6
],
[
"ForwardRef(Styled(Component))",
26,
0.5
],
[
"ForwardRef(Styled(span))",
28,
0.4
]
]
},
{
"target": "projects_create",
"commits": 9,
"renders": 2624,
"self_ms": 22.8,
"top": [
[
"ForwardRef(Styled(td))",
110,
4.0
],
[
"ForwardRef(Styled(Component))",
194,
2.2
],
[
"ForwardRef(Styled(div))",
183,
1.7
],
[
"ForwardRef(TouchRipple)",
5,
1.2
],
[
"ForwardRef(Styled(span))",
85,
1
],
[
"ForwardRef(Tooltip)",
37,
0.9
]
]
},
{
"target": "projects_edit",
"commits": 15,
"renders": 3400,
"self_ms": 25.8,
"top": [
[
"ForwardRef(Styled(td))",
110,
3.0
],
[
"ForwardRef(Styled(Component))",
227,
2.8
],
[
"ForwardRef(Styled(div))",
257,
1.8
],
[
"ForwardRef(Styled(span))",
102,
1
],
[
"Insertion",
1035,
1.0
],
[
"ForwardRef(Styled(input))",
67,
0.9
]
]
},
{
"target": "projects_delete",
"commits": 10,
"renders": 1912,
"self_ms": 18.4,
"top": [
[
"ForwardRef(Styled(td))",
110,
3.2
],
[
"ForwardRef(Styled(Component))",
137,
1.3
],
[
"ForwardRef(TouchRipple)",
6,
1.2
],
[
"ForwardRef(Styled(button))",
45,
1.1
],
[
"ForwardRef(Styled(div))",
126,
0.9
],
[
"ForwardRef(Autocomplete)",
1,
0.8
]
]
},
{
"target": "tasks_create",
"commits": 8,
"renders": 2282,
"self_ms": 14.4,
"top": [
[
"ForwardRef(Styled(Component))",
182,
2.3
],
[
"ForwardRef(Styled(td))",
114,
1.6
],
[
"ForwardRef(Styled(div))",
164,
1.4
],
[
"ForwardRef(Styled(tr))",
19,
0.8
],
[
"ForwardRef(ButtonBase)",
50,
0.7
],
[
"ForwardRef(Styled(button))",
50,
0.6
]
]
},
{
"target": "tasks_confirm_mark",
"commits": 9,
"renders": 1903,
"self_ms": 20.9,
"top": [
[
"ForwardRef(Styled(td))",
114,
5.3
],
[
"ForwardRef(Styled(div))",
142,
2.2
],
[
"ForwardRef(Styled(Component))",
147,
2.0
],
[
"MRT_TableBodyCell",
108,
1.1
],
[
"ForwardRef(Styled(button))",
46,
1.1
],
[
"ForwardRef(Tooltip)",
36,
1.0
]
]
}
]
}

View File

@ -0,0 +1,25 @@
# Рендеры React при открытии модалок: 20261026-s1 (modal_renders.jsonl, hotspots_summary.py --renders-only)
| модалка | коммитов | рендеров | self, мс | топ компонентов (рендеры/self мс) |
|---|---|---|---|---|
| sheet_select_vsp | 14 | 6684 | 30.9 | ForwardRef(Styled(td)) 473/7.6; ForwardRef(Styled(Component)) 392/2.4; ForwardRef(Styled(div)) 361/2.1; ForwardRef(Tooltip) 123/1.4; ForwardRef(Styled(button)) 131/1.3; MRT_TableBodyCellValue 384/1.0 |
| sheet_select_vsp@big | 14 | 6632 | 31.0 | ForwardRef(Styled(td)) 472/8.2; ForwardRef(Styled(div)) 356/2.6; ForwardRef(Styled(Component)) 389/2; ForwardRef(Styled(button)) 130/1.5; ForwardRef(Tooltip) 122/1.5; ForwardRef(ButtonBase) 130/1.4 |
| sheet_select_expense | 13 | 6841 | 34.0 | ForwardRef(Styled(td)) 539/10.7; MRT_Table 1/2.3; ForwardRef(Styled(Component)) 403/1.9; ForwardRef(Styled(div)) 336/1.7; ForwardRef(ButtonBase) 137/1.5; ForwardRef(Tooltip) 123/1.3 |
| sheet_select_expense@big | 13 | 6841 | 32.6 | ForwardRef(Styled(td)) 539/8.5; MRT_Table 1/2.7; ForwardRef(Styled(div)) 336/2.1; ForwardRef(Styled(Component)) 403/1.7; MRT_TableBodyRow 24/1.6; ForwardRef(Styled(button)) 137/1.1 |
| sheet_create_program | 11 | 6670 | 36.4 | ForwardRef(Styled(td)) 539/11.2; ForwardRef(Styled(div)) 314/2.9; ForwardRef(Styled(Component)) 381/2.6; MRT_Table 1/2.5; MRT_TableBodyRow 24/1.6; ForwardRef(Tooltip) 123/1.4 |
| sheet_create_program@big | 11 | 6670 | 28.7 | ForwardRef(Styled(td)) 539/6.8; ForwardRef(Styled(Component)) 381/2.4; MRT_Table 1/2.1; MRT_TableBodyRow 24/1.9; ForwardRef(Styled(div)) 314/1.7; ForwardRef(Tooltip) 123/1.6 |
| sheet_create_project | 11 | 6670 | 39.3 | ForwardRef(Styled(td)) 539/12.6; MRT_Table 1/2.6; ForwardRef(Styled(Component)) 381/2.5; MRT_TableBodyRow 24/1.8; ForwardRef(Tooltip) 123/1.8; ForwardRef(TableCell) 539/1.5 |
| sheet_create_project@big | 11 | 6670 | 28.2 | ForwardRef(Styled(td)) 539/8.0; ForwardRef(Tooltip) 123/4.3; ForwardRef(Styled(Component)) 381/1.8; MRT_TableBodyRow 24/1.7; MRT_Table 1/1.6; MRT_TableBodyCell 480/0.9 |
| sheet_columns_tree | 8 | 940 | 16.0 | ForwardRef(TreeItem) 24/4; ForwardRef(Styled(div)) 106/2.1; ForwardRef(SimpleTreeView) 2/2.0; ForwardRef(Styled(Component)) 82/1; Transition 30/0.7; ForwardRef(SwitchBase) 13/0.6 |
| sheet_columns_tree@big | 8 | 745 | 14.5 | ForwardRef(TreeItem) 18/4.0; ForwardRef(SimpleTreeView) 2/2.2; ForwardRef(Styled(div)) 85/1.6; ForwardRef(Styled(Component)) 64/0.5; ForwardRef(Checkbox) 10/0.5; Insertion 230/0.5 |
| task_stages | 8 | 1375 | 13.0 | ForwardRef(Styled(div)) 134/3.0; ForwardRef(Styled(td)) 131/1.1; ForwardRef(Chip) 24/1; ForwardRef(TouchRipple) 5/1; StagesTable 2/0.7; ForwardRef(Styled(span)) 131/0.7 |
| task_stage_add | 10 | 1780 | 18.0 | ForwardRef(Styled(div)) 120/2.8; ForwardRef(Styled(td)) 125/1.2; ForwardRef(SelectInput) 6/1.2; CalendarInput 4/1.1; ForwardRef(Styled(Component)) 92/1; StageFormTheme 2/0.8 |
| task_stage_edit | 12 | 2277 | 20.9 | ForwardRef(Styled(div)) 183/4.0; ForwardRef(Styled(Component)) 123/1.8; ForwardRef(SelectInput) 10/1.4; ForwardRef(Styled(span)) 129/1; CollapsibleTree 1/1; ForwardRef(Styled(input)) 31/0.8 |
| project_stages | 8 | 416 | 9.1 | ForwardRef(Styled(div)) 45/1.4; ForwardRef(TouchRipple) 5/1.1; ForwardRef(Chip) 3/0.6; ForwardRef(ButtonBase) 5/0.6; StagesTable 2/0.5; ForwardRef(TableCell) 26/0.5 |
| project_add_year | 6 | 194 | 3.7 | ForwardRef(TouchRipple) 5/0.8; ForwardRef(Styled(div)) 30/0.6; ForwardRef(Styled(Component)) 14/0.5; ForwardRef(ButtonBase) 7/0.4; ForwardRef(Styled(Ripple)) 3/0.2; Ripple 3/0.2 |
| project_stage_delete | 11 | 366 | 6.1 | ForwardRef(Styled(div)) 23/0.8; Transition 6/0.8; ForwardRef(Styled(button)) 12/0.6; ForwardRef(ButtonBase) 12/0.6; ForwardRef(Styled(Component)) 26/0.5; ForwardRef(Styled(span)) 28/0.4 |
| projects_create | 9 | 2624 | 22.8 | ForwardRef(Styled(td)) 110/4.0; ForwardRef(Styled(Component)) 194/2.2; ForwardRef(Styled(div)) 183/1.7; ForwardRef(TouchRipple) 5/1.2; ForwardRef(Styled(span)) 85/1; ForwardRef(Tooltip) 37/0.9 |
| projects_edit | 15 | 3400 | 25.8 | ForwardRef(Styled(td)) 110/3.0; ForwardRef(Styled(Component)) 227/2.8; ForwardRef(Styled(div)) 257/1.8; ForwardRef(Styled(span)) 102/1; Insertion 1035/1.0; ForwardRef(Styled(input)) 67/0.9 |
| projects_delete | 10 | 1912 | 18.4 | ForwardRef(Styled(td)) 110/3.2; ForwardRef(Styled(Component)) 137/1.3; ForwardRef(TouchRipple) 6/1.2; ForwardRef(Styled(button)) 45/1.1; ForwardRef(Styled(div)) 126/0.9; ForwardRef(Autocomplete) 1/0.8 |
| tasks_create | 8 | 2282 | 14.4 | ForwardRef(Styled(Component)) 182/2.3; ForwardRef(Styled(td)) 114/1.6; ForwardRef(Styled(div)) 164/1.4; ForwardRef(Styled(tr)) 19/0.8; ForwardRef(ButtonBase) 50/0.7; ForwardRef(Styled(button)) 50/0.6 |
| tasks_confirm_mark | 9 | 1903 | 20.9 | ForwardRef(Styled(td)) 114/5.3; ForwardRef(Styled(div)) 142/2.2; ForwardRef(Styled(Component)) 147/2.0; MRT_TableBodyCell 108/1.1; ForwardRef(Styled(button)) 46/1.1; ForwardRef(Tooltip) 36/1.0 |