From 5dc66627677dfdad02f3d614c9899cedd25addf4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 29 Oct 2026 00:28:30 +0400 Subject: [PATCH] =?UTF-8?q?perf:=20filter=5Fresult=5Fms=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B9=D0=BC=D0=B0=D1=83=D1=82=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B5=20=C2=AB?= =?UTF-8?q?=D0=B4=D0=BE=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- perf/e2e/lib/svod2.ts | 5 +++++ perf/e2e/scenarios/scroll.spec.ts | 11 +++++++---- perf/e2e/tests/svod2-metrics.test.ts | 7 +++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/perf/e2e/lib/svod2.ts b/perf/e2e/lib/svod2.ts index ed61405..c135dc8 100644 --- a/perf/e2e/lib/svod2.ts +++ b/perf/e2e/lib/svod2.ts @@ -69,3 +69,8 @@ export class ByteCounter { return this.firstBytes; } } + +/** filter_result_ms: от fill до стабилизации; ответ поиска (если был) не должен быть позже конца; таймаут ожидания (respAt=null) не учитывается. */ +export function filterResultMs(startAt: number, stableAt: number, respAt: number | null): number { + return Math.max(stableAt, respAt ?? 0) - startAt; +} diff --git a/perf/e2e/scenarios/scroll.spec.ts b/perf/e2e/scenarios/scroll.spec.ts index d6df2f8..9f229d3 100644 --- a/perf/e2e/scenarios/scroll.spec.ts +++ b/perf/e2e/scenarios/scroll.spec.ts @@ -29,7 +29,7 @@ import { attachNetlog } from '../lib/netlog'; import { append, runDir } from '../lib/results'; import { scrollThrough, type Axis } from '../lib/scroll'; import { shouldTrace } from '../lib/trace'; -import { ByteCounter, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, countPagesRequested, isSvod2SearchUrl, placeholderShare, svod2RespRe } from '../lib/svod2'; +import { ByteCounter, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, countPagesRequested, filterResultMs as filterResultMsOf, isSvod2SearchUrl, placeholderShare, svod2RespRe } from '../lib/svod2'; const CONTAINER = '.MuiTableContainer-root'; // MRT: muiTableContainerProps (RealtimeTable.jsx), SummaryTable, Svod2Page const MIN_ROWS = 20; @@ -233,13 +233,16 @@ async function measure(browser: import('@playwright/test').Browser, o: RunOpts) const input = page.locator('.MuiInputBase-root:has(.MuiInputAdornment-positionStart) input').first(); const tFilter = Date.now(); // свод 2 «после»: поиск уходит на сервер; нет запроса (сборка «до») - идём дальше + // ожидание ответа идёт параллельно со стабилизацией: таймаут 5 с на «до» в метрику не попадает + let respAt: number | null = null; const searchResp = t.kind === 'svod2' - ? page.waitForResponse((r) => isSvod2SearchUrl(r.url()), { timeout: 5_000 }).catch(() => null) + ? page.waitForResponse((r) => isSvod2SearchUrl(r.url()), { timeout: 5_000 }).then(() => { respAt = Date.now(); }, () => {}) : null; await input.fill('1'); - if (searchResp) await searchResp; stable = await awaitStable(page, 120_000); - if (t.kind === 'svod2') filterResultMs = Date.now() - tFilter; + const stableAt = Date.now(); + if (searchResp) await searchResp; + if (t.kind === 'svod2') filterResultMs = filterResultMsOf(tFilter, stableAt, respAt); effect = (await signature(page)) !== sigBefore; if (!stable) reason = 'filter did not stabilize in 120s'; else if (!effect) reason = 'filter_no_effect'; diff --git a/perf/e2e/tests/svod2-metrics.test.ts b/perf/e2e/tests/svod2-metrics.test.ts index b4b4e8c..404b2f4 100644 --- a/perf/e2e/tests/svod2-metrics.test.ts +++ b/perf/e2e/tests/svod2-metrics.test.ts @@ -6,6 +6,7 @@ import { isSvod2SearchUrl, svod2RespRe, countPagesRequested, + filterResultMs, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, } from '../lib/svod2.ts'; @@ -62,3 +63,9 @@ test('селекторы', () => { assert.equal(SVOD2_DATA_ROW_SELECTOR, 'tbody tr:not([data-svod2-placeholder])'); assert.equal(SVOD2_PLACEHOLDER_SELECTOR, 'tbody tr[data-svod2-placeholder]'); }); + +test('filterResultMs: нет запроса поиска - только стабилизация', () => { + assert.equal(filterResultMs(1000, 1700, null), 700); + assert.equal(filterResultMs(1000, 1700, 1200), 700); + assert.equal(filterResultMs(1000, 1700, 1900), 900); +});