← EnergyViewFase 3 — exact hergebruik, geheugen en werkverdeling
Geen tarieven, rendementen, heffingen, kandidaten, selectieregels of DP tie-breaking gewijzigd. Golden master: acht scenario's geslaagd, bedragen binnen €0,01 en identieke identifiers/rangschikkingen.
Meting vóór wijziging
node scripts/perf/count-calls.mjs <scenario> <bestand.json> gebruikt V8 precise coverage. Dit telt echte oproepen maar schakelt optimalisatie uit; de looptijd hiervan is geen benchmark.
| Scenario | dynamicBattery vóór | Na | dayAheadDispatch vóór | Na |
|---|
| dynamic-ev-battery | 29.377 | 25.202 | 27 | 24 |
| battery-study | 10.614 | 9.516 | 24 | 22 |
| purchase-plan | 42.457 | 36.462 | 27 | 24 |
Dit bevestigt veel dispatch-oproepen. Niet iedere oproep is een volledige jaar-DP: de dagplanner roept kortere vensters aan. Coverage-tijden zijn niet vergelijkbaar met normale uitvoering.
Wijzigingen
- Exacte cache-identiteit voor ongewijzigde laadvensters, onafhankelijk van nieuwe objectinstanties en de volgorde van objectvelden. Alleen door de dagplanner overschreven instellingen en niet-gebruikte nominalCapacity verdwijnen uit de cachesleutel. De rekeninvoer zelf blijft gelijk.
- Tijdelijke tariefcaches worden na verwerking van dat contract vrijgegeven. Alle prijzen en kandidaten blijven beschikbaar. Kwartierarrays van kandidaten die geen actuele, voorgestelde, handmatig gekozen of met/zonder-batterijwinnaar meer kunnen worden, worden vrijgegeven. Regressietest vergelijkt 2.520 selecties inclusief gelijke prijzen, filters en handmatige keuzes.
- Eén gedeelde workerpool voor rapport, preview, investering, batterijstudie, tariefhistorie en CSV. Onbekend/mobiel geheugen: één slot; minstens acht cores én 8 GiB: maximaal twee. Zware analyses gebruiken de hele capaciteit, zodat gelijktijdigheid geen bestaande tijdslimieten/kandidaatsets beïnvloedt. Prioriteiten en timeouts blijven gelijk. Workers worden na hun taak beëindigd om hun grote objectgraaf vrij te geven.
- CSV-parsing verhuisd naar de worker. Nieuwe import annuleert achterhaalde taken; geannuleerde imports schrijven geen status over een nieuwe import. Headerdetectie gebruikt indexOf. Leeg/BOM/CR/LF/komma/puntkomma/quotes vergeleken met de oorspronkelijke parser (107 fixtures). Samenvatten na import gebeurt nog op de hoofdthread.
Voor/na (indicatieve Node-meting, dezelfde harness/fixtures)
npm run perf:golden -- --out=.perf-results/audit-phase3-retention
| Scenario | Fase 2 s | Fase 3 s | Piek-RSS vóór MiB | Na MiB | Heap na vóór MiB | Na MiB |
|---|
| dynamic-ev-battery | 16,978 | 15,170 | 1.177 | 1.103 | 917 | 696 |
| battery-study | 7,715 | 7,640 | 817 | 833 | 608 | 614 |
| purchase-plan | 22,304 | 19,472 | 1.239 | 1.092 | 979 | 477 |
Eén run per versie, geen statistisch bewezen versnelling; gedeelde CPU/GC geven spreiding. De studie gebruikt in deze run iets meer geheugen. Het mobiele geheugenrisico is verminderd maar niet opgelost: nog circa 1,1 GiB piek. Geen claim van <2 s of geen browser-Long-Tasks.
node scripts/perf/csv.mjs: vijf herhalingen, mediaan, eenvoudige synthetische rijen: één jaar 15,95 → 12,32 ms; vier jaar 42,09 → 39,04 ms. Dit zijn parser-CPU-tijden in Node, geen browser-importtijden en niet dezelfde fixture/omgeving als de externe audit. De belangrijkste UI-wijziging is verplaatsing naar een worker. De echte Node-worker is getest met 35.040 rijen terwijl de hoofd-eventloop doorloopt; browserresponsiviteit daarmee niet gemeten.
Bewust niet gedaan
Grove batterijzoektocht/vroegtijdig afbreken kan bij discontinue capaciteitstarieven en sturing een winnaar missen. Zonder bewezen ondergrens is dat onverenigbaar met exact dezelfde rangschikking. Geen min-plus-herschrijving zonder bewijs van voordeel en identieke tie-breaking. Typed-array-transformatie en verdere structurele geheugenbesparing blijven werkpunten.
Volledige fasecontrole: 181/181 tests geslaagd, geen nieuwe ESLint- of checkJs-diagnosegroepen. Deployment-source-test controleert reproduceerbaarheid van beide Cloudflare-builds en HA-bestanden. De bestaande statische diagnosebaseline is niet nul (zie fase 1).