← EnergyViewPerformance- en uitkomstcontrole
Dit beschrijft het oorspronkelijke meetgereedschap. De latere audit en optimalisaties staan in docs/audit. Tarieven en uitkomsten zijn daarbij niet gewijzigd.
Uitvoeren
Gebruik Node 22+ en voer commando's uit vanuit de projectroot. Stop andere zware processen voor vergelijkbare CPU-cijfers.
npm test
npm run perf:golden # alle acht synthetische scenario's; geen timingbudget
npm run perf:assets # bron/uitgeleverde bytes + lokale compressie/parse
npm run perf -- --node-only # golden + CPU-profielen + Node tijd/geheugenbudget
npm run perf # idem + verplichte desktop/mobiele browserbudgetten
npm run perf heeft exitcode 2 als de browser ontbreekt. Ontbrekende metingen worden niet als geslaagd beschouwd. --node-only is nadrukkelijk een deelmeting. Standaard staat uitvoer in .perf-results/latest/, met per scenario JSON en een DevTools-leesbaar .cpuprofile. Gebruik --out=.perf-results/naam om een run apart te bewaren.
Playwright apart installeren
Geen nieuwe runtime-dependency voor de app. Installeer de dev-tool in een losse, genegeerde map:
npm install --prefix .perf-tools --no-package-lock playwright@1.62.1
node .perf-tools/node_modules/playwright/cli.js install chromium --only-shell
npm run perf:browser
Alternatieven: PERF_PLAYWRIGHT_MODULE=/absoluut/pad/naar/playwright/index.mjs, PERF_CHROMIUM_PATH=/absoluut/pad/naar/chromium. De runner kan ook de aanwezige Codex-runtime gebruiken. Browserinstallatie is in deze omgeving mislukt met een onbruikbare ZIP-download. De browsercode is syntactisch gecontroleerd, maar de flows zijn hier niet end-to-end gevalideerd; dat is een expliciete opleveringsbeperking.
De standaardbrowserrunner start een tijdelijke, uitsluitend lokale origin met dezelfde gebundelde Worker. Marktdata is een synthetische fixture, geen externe API-meting. Via npm run perf -- --url=https://... kan een geschikte bereikbare testorigin worden gebruikt. Die origin moet de fixture-seedpagina /__perf_seed bevatten; dit endpoint bestaat alleen in de lokale benchmarkserver, niet in de productiesite. Gebruik de productiesite dus niet voor de seeding-flow. Er worden geen bestaande browserprofielen of gebruikerssessies gebruikt.
Browsermetingen: een vers desktop- en mobiel-context, koud cachepad, netwerkbytes/responseheaders via CDP, JSheap/ScriptDuration via Performance, CPU-profiel van de hoofdthread, observer voor Long Tasks, tijd tot invoer mogelijk en tijd na contractkeuze. Een extra luisteraar rond Worker meet postMessage-serialisatie, voortgang en afronding; het instrumentatie-effect hoort bij de benchmark. Input blijft tijdens het achtergrondwerk herhaald worden, tot afronding of maximaal 90 seconden. Een niet-afgeronde analyse faalt het browserbudget.
Mobiel gebruikt expliciet CDP 150 ms RTT, 1.600 Kbit/s down, 750 Kbit/s up en 4x CPU. Dat is geen Lighthouse-run, en deze parameters worden niet stilzwijgend een Lighthouse-score of echte telefoonmeting genoemd. Voor een echte Lighthouse-baseline en exacte presetpariteit is een aanvullende Lighthouse-run nodig zodra Chromium werkt. De runner schrijft ook een CDP-trace en berekent de unie van herkenbare parse/compile-slices op renderer-main-threads. Dit pad is hier niet uitgevoerd/gevalideerd; ScriptDuration en Node JSON.parse zijn geen vervanging voor die browsermeting.
Vangnet en herijken
- Referenties:
tests/perf/golden.json. - Vaste synthetische inputs, echte gebundelde tarieven, vaste jaarkwartieren en modelmaand uit de broncurve; geen privé-export.
- Maximaal €0,01 verschil voor bedragen, maximaal 1e-8 voor fysieke waarden; exacte scenario-/veldstructuur, geselecteerde variant en rangvolgorde/identiteiten.
- Een gewijzigde tariefdataset of curve faalt expliciet. Een nieuwe baseline vereist inhoudelijke review.
- Alleen bewust heropnemen:
npm run perf:golden:record -- --replace-golden. tests/perf-harness.mjs test dat de comparator echte afwijkingen/reordering afkeurt.tests/perf-policy.mjs legt met fictieve bedragen de bestaande discrepantie tussen screeningregel en minimumjaarrekening vast. Die test bewaart het huidige gedrag; hij verklaart het niet correct als UX.
Budgetten
tests/perf/budgets.json bewaart vaste initiële Node-regressielimieten (eerste cold baseline +30% +250 ms, peak RSS +25%) en de gevraagde UX-limieten. Limieten worden niet automatisch opnieuw opgenomen als een run trager wordt. Node-CPU-tijden zijn hardware- en contentiongevoelig: vergelijk alleen op een overeenkomstige, geïsoleerde runner. Browserdoelen zijn nog onbeoordeeld. Voer geen npm test parallel aan een timingbaseline uit; de tweede correctheidsrun tijdens deze sessie was bewust afzonderlijk gerapporteerd als gecontendeerd en overschreed een CPU-budget ondanks identieke resultaten.
Historisch stopmoment
Het oorspronkelijke onderzoek stopte na het vangnet en de baseline. Inmiddels zijn de auditfasen uitgevoerd; zie het auditoverzicht voor actuele wijzigingen, metingen en beperkingen. De browserdoelen blijven onbewezen zolang de throttled browserharness niet kan draaien.