fix(optimizer): ускорить точный выбор проб из большого пула

This commit is contained in:
Denozordec committed 2026-10-07 12:24:07 +07:00
1 parent c6dfa5267b
commit 52d8a05480
8 files changed
+306 -32

No files matched your search

+11
View File
@@ -170,3 +170,14 @@ Final1000WAN:134chars/86.5px высоты summary; WAN10:130chars/86.5px. В т
2026-10-04, UI/source расчёта не менялись. Child script принимает integer count20–1000, hard timeout10с, без API/DB/браузера/сети.7WAN×1000: equal1217.5ms (IDs p0..6), varied7967.5ms (p13..19), freshness не завершился за10с, процесс остановлен. Startup отдельно ~0.4s. Freshness создаёт1000 разных возрастов, будущие timestamps не используются. ESLint скрипта прошёл; корректность ID проверяется после успешного завершения.
Это оставшийся CPU риск, а не performance приёмка. В current DFS повторяются Date.parse/trim/score и оценка upper для ветвей, уже достигших максимум. Следующий12.3.66: score cache только для bounded WAN≤7 DFS с одним snapshot time и early stop при достижении node upper, preserving first tie/order/forced picks/greedy fallback. Проверить1200 legacy oracle fixtures, raw observations, profiles20/1000. Худшая комбинаторика и весь full-route product по-прежнему не ограничены.
## 12.3.66 — точный выбор проб из большого pool
2026-10-07. Score matrix вычисляется только при exact DFS≤7WAN/pool≥WAN, с единым временем ранжирования на назначение JH. Сырые наблюдения/даты не меняются, greedy fallback сохранён. Допустимый score-first greedy путь даёт только lower total, не готовое назначение. Пока DFS не нашёл реальный witness, равные верхние границы НЕ отсекаются; первое равное назначение остаётся в исходном pool order. Node stop требует реального bestAssign. Для каждого кандидата child upper выводится из topK максимумов текущего узла с исключением занятой пробы; уже проигрышные siblings не пересканируют весь pool. Forced pick сохраняется, даже если ветвь отсечена.
1230 seeded сравнений с независимым прежним DFS совпали по точным probe IDs, включая30 смешанных наборов7WAN.10 pure tests прошли: ties/partial matching, single snapshot при переходе часа, прежний greedy для8WAN, unknown/zero/disabled/raw snapshots.51 main browser и8 context прошли; TypeScript без incremental, targeted lint и production build успешны. Historical9 optimizer PNG восстановлены по точному списку.
Pure child CPU1000: equal1217.5→15.6ms,varied7967.5→14.5ms,freshness10с timeout→16.7ms; CPU20:11.5–11.7ms. Child startup отдельно~0.25s. Exact IDs проверены во всех6 профилях. Evidence docs/ux-ui/acceptance/optimizer-probes-cpu-2026-10-07.json содержит source SHA256, baseline HEAD и результаты. Браузерная live ветка7WAN/1000probes:219902bytes/7rows/222tableDOM/1018ms dev-ready; timestamps соответствуют p993..999, после refresh сохраняются,320px без overflow, API mutations отсутствуют. Это не production SLA/нагрузка PostgreSQL/RouterOS и не гарантия произвольного mixed pool: худшая экспоненциальная сложность DFS и full-route product остаются.
Следующий12.3.67: KPI captions JH/Exit (повторы/пустая площадка/unknown), затем separate full-route CPU profile. Общая main/context регрессия12.4.6/7 относится к прежним HEAD; этот delta принят профильными51+8. Внешняя12.5 не выполнена.
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-04: 12.3.65 baseline7WAN×1000pool сохранён: equal1218ms,varied7968ms,freshness timeout10с. Следующий12.3.66: кешировать score пары WAN/probe на одном времени снимка только в DFS≤7, безопасно завершать ветвь при достижении её upper bound; доказать exact IDs/ties и повторить20/1000 child profiles. Не запускать тяжёлый pool в UI. Внешняя12.5 остаётся.
Актуальное продолжение 2026-10-07: 12.3.66 завершён: DFS score cache/one-time snapshot/lower-bound/child-bound, exact1230 fixtures,10pure+51main+8context/build passed. CPU1000 equal15.6ms,varied14.5ms,freshness16.7ms вместо10с timeout. Следующий12.3.67: краткие KPI captions JH/Exit с честными площадками/unknown. Затем отдельный CPU-профиль full-route product; внешняя12.5 остаётся.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+1 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-04: 12.3.65 baseline7WAN×1000pool сохранён: equal1218ms,varied7968ms,freshness timeout10с. Следующий12.3.66: кешировать score пары WAN/probe на одном времени снимка только в DFS≤7, безопасно завершать ветвь при достижении её upper bound; доказать exact IDs/ties и повторить20/1000 child profiles. Не запускать тяжёлый pool в UI. Внешняя12.5 остаётся.
Актуальное продолжение 2026-10-07: 12.3.66 завершён: DFS score cache/one-time snapshot/lower-bound/child-bound, exact1230 fixtures,10pure+51main+8context/build passed. CPU1000 equal15.6ms,varied14.5ms,freshness16.7ms вместо10с timeout. Следующий12.3.67: краткие KPI captions JH/Exit с честными площадками/unknown. Затем отдельный CPU-профиль full-route product; внешняя12.5 остаётся.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения.
+11
View File
@@ -747,3 +747,14 @@ Final1000WAN:134chars/86.5px высоты summary; WAN10:130chars/86.5px. В т
2026-10-04, UI/source расчёта не менялись. Child script принимает integer count20–1000, hard timeout10с, без API/DB/браузера/сети.7WAN×1000: equal1217.5ms (IDs p0..6), varied7967.5ms (p13..19), freshness не завершился за10с, процесс остановлен. Startup отдельно ~0.4s. Freshness создаёт1000 разных возрастов, будущие timestamps не используются. ESLint скрипта прошёл; корректность ID проверяется после успешного завершения.
Это оставшийся CPU риск, а не performance приёмка. В current DFS повторяются Date.parse/trim/score и оценка upper для ветвей, уже достигших максимум. Следующий12.3.66: score cache только для bounded WAN≤7 DFS с одним snapshot time и early stop при достижении node upper, preserving first tie/order/forced picks/greedy fallback. Проверить1200 legacy oracle fixtures, raw observations, profiles20/1000. Худшая комбинаторика и весь full-route product по-прежнему не ограничены.
## 12.3.66 — точный выбор проб из большого pool
2026-10-07. Score matrix вычисляется только при exact DFS≤7WAN/pool≥WAN, с единым временем ранжирования на назначение JH. Сырые наблюдения/даты не меняются, greedy fallback сохранён. Допустимый score-first greedy путь даёт только lower total, не готовое назначение. Пока DFS не нашёл реальный witness, равные верхние границы НЕ отсекаются; первое равное назначение остаётся в исходном pool order. Node stop требует реального bestAssign. Для каждого кандидата child upper выводится из topK максимумов текущего узла с исключением занятой пробы; уже проигрышные siblings не пересканируют весь pool. Forced pick сохраняется, даже если ветвь отсечена.
1230 seeded сравнений с независимым прежним DFS совпали по точным probe IDs, включая30 смешанных наборов7WAN.10 pure tests прошли: ties/partial matching, single snapshot при переходе часа, прежний greedy для8WAN, unknown/zero/disabled/raw snapshots.51 main browser и8 context прошли; TypeScript без incremental, targeted lint и production build успешны. Historical9 optimizer PNG восстановлены по точному списку.
Pure child CPU1000: equal1217.5→15.6ms,varied7967.5→14.5ms,freshness10с timeout→16.7ms; CPU20:11.5–11.7ms. Child startup отдельно~0.25s. Exact IDs проверены во всех6 профилях. Evidence docs/ux-ui/acceptance/optimizer-probes-cpu-2026-10-07.json содержит source SHA256, baseline HEAD и результаты. Браузерная live ветка7WAN/1000probes:219902bytes/7rows/222tableDOM/1018ms dev-ready; timestamps соответствуют p993..999, после refresh сохраняются,320px без overflow, API mutations отсутствуют. Это не production SLA/нагрузка PostgreSQL/RouterOS и не гарантия произвольного mixed pool: худшая экспоненциальная сложность DFS и full-route product остаются.
Следующий12.3.67: KPI captions JH/Exit (повторы/пустая площадка/unknown), затем separate full-route CPU profile. Общая main/context регрессия12.4.6/7 относится к прежним HEAD; этот delta принят профильными51+8. Внешняя12.5 не выполнена.
@@ -0,0 +1,166 @@
{
"baseHead": "c6dfa5267b210b01fe72cbac7b310d3960a6a131",
"sourceSha256": "53273273c46f78cde2c82cff52b282dd19dcfc5c363f0b64c0b50cac44e20510",
"environment": "Pure calculation child process, no API/database/network",
"runs": [
{
"variant": "equal",
"wanCount": 7,
"probeCount": 20,
"timeoutMs": 10000,
"elapsedMs": 273,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 11.667099999999976,
"legs": 7,
"probeIds": [
"p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6"
]
},
"error": ""
},
{
"variant": "varied",
"wanCount": 7,
"probeCount": 20,
"timeoutMs": 10000,
"elapsedMs": 245,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 11.477599999999995,
"legs": 7,
"probeIds": [
"p13",
"p14",
"p15",
"p16",
"p17",
"p18",
"p19"
]
},
"error": ""
},
{
"variant": "freshness",
"wanCount": 7,
"probeCount": 20,
"timeoutMs": 10000,
"elapsedMs": 275,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 11.482100000000003,
"legs": 7,
"probeIds": [
"p13",
"p14",
"p15",
"p16",
"p17",
"p18",
"p19"
]
},
"error": ""
},
{
"variant": "equal",
"wanCount": 7,
"probeCount": 1000,
"timeoutMs": 10000,
"elapsedMs": 247,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 15.580399999999997,
"legs": 7,
"probeIds": [
"p0",
"p1",
"p2",
"p3",
"p4",
"p5",
"p6"
]
},
"error": ""
},
{
"variant": "varied",
"wanCount": 7,
"probeCount": 1000,
"timeoutMs": 10000,
"elapsedMs": 244,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 14.4709,
"legs": 7,
"probeIds": [
"p13",
"p14",
"p15",
"p16",
"p17",
"p18",
"p19"
]
},
"error": ""
},
{
"variant": "freshness",
"wanCount": 7,
"probeCount": 1000,
"timeoutMs": 10000,
"elapsedMs": 242,
"status": 0,
"timedOut": false,
"result": {
"elapsedMs": 16.685599999999994,
"legs": 7,
"probeIds": [
"p993",
"p994",
"p995",
"p996",
"p997",
"p998",
"p999"
]
},
"error": ""
}
],
"browserProfiles": {
"source": "Playwright stdout, live API fixture",
"passed": 51,
"contextPassed": 8,
"profiles": [
{
"poolCount": 20,
"probeBytes": 4382,
"rendered": 7,
"tableNodes": 222,
"readyMs": 1293
},
{
"poolCount": 1000,
"probeBytes": 219902,
"rendered": 7,
"tableNodes": 222,
"readyMs": 1018
}
]
}
}