From 9bdd0b1a60165879f4843e2964bb8446c5512431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Thu, 22 Oct 2026 05:55:38 +0200 Subject: [PATCH] perf(bench): record the baseline on the v1.44.0 runtime One run of scripts/bench/run.ts against the seeded account (1,266,549 measurement rows, anchor 2026-10-22), 20 measured requests per row after 3 warm-up requests, web-only production build, 792 MB heap ceiling, Postgres 16.15. The commit adds only lint rules, guards, tests and scripts on top of v1.44.0, so the server code measured is the v1.44.0 code. Cold (caches evicted before each request), p95 and statements per request: /api/auth/me 17 ms / 19, dashboard summary 233 ms / 31, dashboard snapshot 2253 ms / 158, pulse series 30 d 59 ms / 8, 365 d 311 ms / 8, 3650 d 2118 ms / 8, day view 78 ms / 49, insights health status 140 ms / 68, correlations 105 ms / 45. Warm, the snapshot is 24 ms / 13 and the 3650-day series still 1506 ms, since that read is not cached. The 5,000-row batch ingest took 1722 ms and 424 statements over ten requests. The machine was shared with other work during the run (load average 8 to 20), so latency is indicative; the statement counts do not depend on it. The results directory is written by the script and left out of prettier, so a re-run diffs cleanly. --- .prettierignore | 4 + scripts/bench/results/v1.44.0-baseline.json | 254 ++++++++++++++++++++ scripts/bench/results/v1.44.0-baseline.md | 25 ++ 3 files changed, 283 insertions(+) create mode 100644 scripts/bench/results/v1.44.0-baseline.json create mode 100644 scripts/bench/results/v1.44.0-baseline.md diff --git a/.prettierignore b/.prettierignore index 2dd095877..3ed52cc01 100644 --- a/.prettierignore +++ b/.prettierignore @@ -21,3 +21,7 @@ public/sw.js # writer's JSON layout is the canonical one, so a write-back never fails the # format check. src/__tests__/baselines + +# Benchmark results, written by scripts/bench/run.ts and committed as they +# come out, so a re-run diffs cleanly against the last one. +scripts/bench/results diff --git a/scripts/bench/results/v1.44.0-baseline.json b/scripts/bench/results/v1.44.0-baseline.json new file mode 100644 index 000000000..d6c5cc5dd --- /dev/null +++ b/scripts/bench/results/v1.44.0-baseline.json @@ -0,0 +1,254 @@ +{ + "meta": { + "label": "v1.44.0-baseline", + "commit": "d640eea32", + "date": "2026-10-22T03:54:05.746Z", + "node": "v22.23.2", + "postgres": "16.15", + "cpus": 14, + "loadAverage": [ + 9.4, + 20.1, + 20 + ], + "measurements": 1266549, + "iterations": 20, + "warmup": 3, + "heapMb": 792, + "idleStatementsPerSecond": 0, + "batch5k": { + "totalMs": 1722, + "totalStatements": 424 + } + }, + "results": [ + { + "name": "/api/auth/me", + "mode": "cold", + "request": "GET /api/auth/me", + "n": 20, + "p50Ms": 12.1, + "p95Ms": 17.4, + "maxMs": 18.4, + "statementsMedian": 19, + "statementsMax": 19, + "failures": 0 + }, + { + "name": "/api/auth/me", + "mode": "warm", + "request": "GET /api/auth/me", + "n": 20, + "p50Ms": 16.6, + "p95Ms": 22.2, + "maxMs": 24.4, + "statementsMedian": 19, + "statementsMax": 19, + "failures": 0 + }, + { + "name": "dashboard summary", + "mode": "cold", + "request": "GET /api/dashboard/summary", + "n": 20, + "p50Ms": 205.6, + "p95Ms": 233.2, + "maxMs": 275.3, + "statementsMedian": 31, + "statementsMax": 32, + "failures": 0 + }, + { + "name": "dashboard summary", + "mode": "warm", + "request": "GET /api/dashboard/summary", + "n": 20, + "p50Ms": 12.8, + "p95Ms": 14.3, + "maxMs": 27.5, + "statementsMedian": 7, + "statementsMax": 7, + "failures": 0 + }, + { + "name": "dashboard snapshot", + "mode": "cold", + "request": "GET /api/dashboard/snapshot", + "n": 20, + "p50Ms": 2157.8, + "p95Ms": 2252.7, + "maxMs": 2292.9, + "statementsMedian": 158, + "statementsMax": 161, + "failures": 0 + }, + { + "name": "dashboard snapshot", + "mode": "warm", + "request": "GET /api/dashboard/snapshot", + "n": 20, + "p50Ms": 15.6, + "p95Ms": 23.5, + "maxMs": 25.6, + "statementsMedian": 13, + "statementsMax": 16, + "failures": 0 + }, + { + "name": "series pulse 30 d", + "mode": "cold", + "request": "GET /api/measurements/series?kind=pulse&days=30", + "n": 20, + "p50Ms": 50.8, + "p95Ms": 58.7, + "maxMs": 58.9, + "statementsMedian": 8, + "statementsMax": 9, + "failures": 0 + }, + { + "name": "series pulse 30 d", + "mode": "warm", + "request": "GET /api/measurements/series?kind=pulse&days=30", + "n": 20, + "p50Ms": 52.3, + "p95Ms": 59.5, + "maxMs": 59.9, + "statementsMedian": 8, + "statementsMax": 8, + "failures": 0 + }, + { + "name": "series pulse 365 d", + "mode": "cold", + "request": "GET /api/measurements/series?kind=pulse&days=365", + "n": 20, + "p50Ms": 289, + "p95Ms": 311.3, + "maxMs": 363.7, + "statementsMedian": 8, + "statementsMax": 9, + "failures": 0 + }, + { + "name": "series pulse 365 d", + "mode": "warm", + "request": "GET /api/measurements/series?kind=pulse&days=365", + "n": 20, + "p50Ms": 274.3, + "p95Ms": 355.8, + "maxMs": 366.8, + "statementsMedian": 8, + "statementsMax": 8, + "failures": 0 + }, + { + "name": "series pulse 3650 d", + "mode": "cold", + "request": "GET /api/measurements/series?kind=pulse&days=3650", + "n": 20, + "p50Ms": 1502.6, + "p95Ms": 2117.6, + "maxMs": 2122.9, + "statementsMedian": 8, + "statementsMax": 9, + "failures": 0 + }, + { + "name": "series pulse 3650 d", + "mode": "warm", + "request": "GET /api/measurements/series?kind=pulse&days=3650", + "n": 20, + "p50Ms": 1490.3, + "p95Ms": 1505.5, + "maxMs": 1555.2, + "statementsMedian": 8, + "statementsMax": 11, + "failures": 0 + }, + { + "name": "day view", + "mode": "cold", + "request": "GET /api/day/2026-10-21", + "n": 20, + "p50Ms": 61.7, + "p95Ms": 77.5, + "maxMs": 86.1, + "statementsMedian": 49, + "statementsMax": 50, + "failures": 0 + }, + { + "name": "day view", + "mode": "warm", + "request": "GET /api/day/2026-10-21", + "n": 20, + "p50Ms": 49, + "p95Ms": 55.6, + "maxMs": 62.5, + "statementsMedian": 48, + "statementsMax": 48, + "failures": 0 + }, + { + "name": "insights health status", + "mode": "cold", + "request": "GET /api/insights/health-status", + "n": 20, + "p50Ms": 124.1, + "p95Ms": 139.5, + "maxMs": 141.5, + "statementsMedian": 68, + "statementsMax": 68, + "failures": 0 + }, + { + "name": "insights health status", + "mode": "warm", + "request": "GET /api/insights/health-status", + "n": 20, + "p50Ms": 124.7, + "p95Ms": 157.8, + "maxMs": 165.3, + "statementsMedian": 68, + "statementsMax": 68, + "failures": 0 + }, + { + "name": "insights correlations", + "mode": "cold", + "request": "GET /api/insights/correlations", + "n": 20, + "p50Ms": 95.4, + "p95Ms": 105, + "maxMs": 108.8, + "statementsMedian": 45, + "statementsMax": 45, + "failures": 0 + }, + { + "name": "insights correlations", + "mode": "warm", + "request": "GET /api/insights/correlations", + "n": 20, + "p50Ms": 13, + "p95Ms": 15.4, + "maxMs": 15.9, + "statementsMedian": 8, + "statementsMax": 8, + "failures": 0 + }, + { + "name": "batch ingest 5k (per 500)", + "mode": "write", + "request": "POST /api/measurements/batch ×10", + "n": 10, + "p50Ms": 163, + "p95Ms": 220.7, + "maxMs": 220.7, + "statementsMedian": 42, + "statementsMax": 45, + "failures": 0 + } + ] +} diff --git a/scripts/bench/results/v1.44.0-baseline.md b/scripts/bench/results/v1.44.0-baseline.md new file mode 100644 index 000000000..09ecb185e --- /dev/null +++ b/scripts/bench/results/v1.44.0-baseline.md @@ -0,0 +1,25 @@ +# Benchmark v1.44.0-baseline + +Commit d640eea32, 2026-10-22T03:54:05.746Z. 1266549 measurement rows on the bench account, 20 measured requests per row after 3 warm-up requests, one at a time. Server: production build, web process, heap ceiling 792 MB. Postgres 16.15, 14 cores, load average 9.4,20.1,20 at the end. Idle background: 0 statements/s. + +| Request | Mode | n | p50 ms | p95 ms | max ms | statements (median) | statements (max) | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | +| /api/auth/me | cold | 20 | 12.1 | 17.4 | 18.4 | 19 | 19 | +| /api/auth/me | warm | 20 | 16.6 | 22.2 | 24.4 | 19 | 19 | +| dashboard summary | cold | 20 | 205.6 | 233.2 | 275.3 | 31 | 32 | +| dashboard summary | warm | 20 | 12.8 | 14.3 | 27.5 | 7 | 7 | +| dashboard snapshot | cold | 20 | 2157.8 | 2252.7 | 2292.9 | 158 | 161 | +| dashboard snapshot | warm | 20 | 15.6 | 23.5 | 25.6 | 13 | 16 | +| series pulse 30 d | cold | 20 | 50.8 | 58.7 | 58.9 | 8 | 9 | +| series pulse 30 d | warm | 20 | 52.3 | 59.5 | 59.9 | 8 | 8 | +| series pulse 365 d | cold | 20 | 289 | 311.3 | 363.7 | 8 | 9 | +| series pulse 365 d | warm | 20 | 274.3 | 355.8 | 366.8 | 8 | 8 | +| series pulse 3650 d | cold | 20 | 1502.6 | 2117.6 | 2122.9 | 8 | 9 | +| series pulse 3650 d | warm | 20 | 1490.3 | 1505.5 | 1555.2 | 8 | 11 | +| day view | cold | 20 | 61.7 | 77.5 | 86.1 | 49 | 50 | +| day view | warm | 20 | 49 | 55.6 | 62.5 | 48 | 48 | +| insights health status | cold | 20 | 124.1 | 139.5 | 141.5 | 68 | 68 | +| insights health status | warm | 20 | 124.7 | 157.8 | 165.3 | 68 | 68 | +| insights correlations | cold | 20 | 95.4 | 105 | 108.8 | 45 | 45 | +| insights correlations | warm | 20 | 13 | 15.4 | 15.9 | 8 | 8 | +| batch ingest 5k (per 500) | write | 10 | 163 | 220.7 | 220.7 | 42 | 45 |