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 |