← EnergyView

Exact search and memory work (2026-11-02)

A — exact search

All capacities remain evaluated. No plateau threshold was introduced: monotonicity alone does not prove that a later capacity cannot improve after a plateau. A general reachability truncation was rejected because it changed floating-point tie paths. Only the forced-empty state is pruned, with full original search for every other case. The strict sizing maximum has a deterministic hardware tie-break; the existing 95% recommendation rule is unchanged. Finite time-budget prioritisation is preserved.

Five sequential fresh Node 24 processes per scenario, same machine, no concurrent test/build/benchmark jobs. V8 Inspector sampling at 1 ms records CPU profiles and GC share (not the CLI --cpu-prof flag). Ambient VM contention cannot be excluded. Spread below is full min–max; values in MiB.

ScenarioBefore seconds (range)A seconds (range)Before RSS (range)A RSS (range)Before / A GC % (range)
dynamic-ev-battery21.12 (19.84–25.38)19.28 (18.06–20.90)986.45 (971.66–1002.03)1005.16 (980.98–1053.71)8.87 (8.25–10.33) / 7.57 (7.00–7.76)
battery-study9.83 (9.27–12.80)8.77 (7.68–9.97)817.82 (778.62–834.62)840.04 (830.34–852.17)9.32 (8.80–11.18) / 7.90 (7.71–8.79)
purchase-plan25.81 (21.57–27.14)22.84 (21.42–24.31)1050.57 (1049.35–1058.55)1063.20 (1035.80–1085.85)9.19 (8.08–10.00) / 7.59 (7.04–7.82)

No speedup is claimed: median time differences are smaller than baseline ranges. Peak RSS did not improve. Exact call counts remain unchanged: battery-study dynamicBattery 9,516, purchase-plan 36,330.

Validation: 195/195 tests, lint/typecheck/format, unchanged golden master pass. The test suite includes the three deployment builds and byte-reproducible Pages output. No real-browser behavior was verified in this step.

Reproduce: node scripts/perf/repeated.mjs .perf-results/my-run 5. Call counts: node scripts/perf/count-calls.mjs battery-study .perf-results/calls.json. Raw samples/profiles are local ignored .perf-results artifacts; the checked-in report contains the measured summary.

B1

Reuse bounded (1 MiB, six entries) owned scratch Float64Array buffers and replay checkpoints into the existing buffer. Cached policies and returned traces/profiles are never pooled. Median differences remain within the preceding full timing spreads; no demonstrated speedup or peak-memory reduction is claimed. Initial full-suite run: one new offline fixture failed because SheetJS in a VM cannot write files; the fixture was corrected to use the public buffer writer. Repeat: 197/197 tests pass, unchanged golden master passes, lint/type/format pass. No existing test or reference was weakened.

ScenarioBefore seconds (min–max)After seconds (min–max)Before RSS MiB (min–max)After RSS MiB (min–max)Before / after GC % (min–max)
dynamic-ev-battery19.28 (18.06–20.90)18.02 (17.53–18.78)1005.16 (980.98–1053.71)986.04 (957.81–1004.76)7.57 (7.00–7.76) / 8.14 (7.22–8.74)
battery-study8.77 (7.68–9.97)8.34 (7.86–9.08)840.04 (830.34–852.17)821.38 (806.57–866.65)7.90 (7.71–8.79) / 9.26 (7.58–9.74)
purchase-plan22.84 (21.42–24.31)21.79 (20.99–22.48)1063.20 (1035.80–1085.85)1045.54 (1032.77–1074.98)7.59 (7.04–7.82) / 8.03 (7.74–8.99)

B2

Cache complete-month geometry by immutable profile identity and explicitly share only clock metadata through meter conversion, PV storage, DP storage and curtailment. calendarAt already had a timestamp cache and was not duplicated. Public period arrays remain defensive copies; no parent profile is strongly retained. All 198 tests, unchanged golden, lint/type/format pass, including deployment reproducibility. No overall speed or RSS win exceeds the observed spreads; the isolated peak-period hotspot is lower, but total time is statistically inconclusive. Profiles must remain immutable, as already required by the existing pricing/simulator caches.

ScenarioBefore seconds (min–max)After seconds (min–max)Before RSS MiB (min–max)After RSS MiB (min–max)Before / after GC % (min–max)
dynamic-ev-battery18.02 (17.53–18.78)18.69 (17.77–20.62)986.04 (957.81–1004.76)992.67 (987.46–1046.93)8.14 (7.22–8.74) / 7.00 (6.73–7.28)
battery-study8.34 (7.86–9.08)8.31 (7.53–9.66)821.38 (806.57–866.65)833.24 (806.93–853.88)9.26 (7.58–9.74) / 8.32 (7.60–9.79)
purchase-plan21.79 (20.99–22.48)21.62 (20.59–25.16)1045.54 (1032.77–1074.98)1038.86 (1027.37–1067.43)8.03 (7.74–8.99) / 7.20 (6.71–7.77)

B3 experiment (rejected)

Tested report-local product/profile repricing memoization plus canonical source-product reuse. All 199 tests, golden, lint/type/format pass. Supplemental precise V8 block coverage shows ZERO hits among 11,506 repricing requests in battery-study: existing complete-bill caches already eliminate repeats. Five-run medians show no demonstrated gain; purchase-plan has a 1,235 MiB outlier. This additional runtime cache is rejected and removed in the following commit. The existing reportPricing quotes/rates and historical monthly aggregation caches remain. Precise-coverage times are not benchmark times.

ScenarioBefore seconds (min–max)After seconds (min–max)Before RSS MiB (min–max)After RSS MiB (min–max)Before / after GC % (min–max)
dynamic-ev-battery18.69 (17.77–20.62)18.98 (17.34–21.56)992.67 (987.46–1046.93)999.39 (963.68–1021.51)7.00 (6.73–7.28) / 6.71 (6.58–7.35)
battery-study8.31 (7.53–9.66)8.57 (7.44–10.27)833.24 (806.93–853.88)833.12 (826.12–855.02)8.32 (7.60–9.79) / 7.94 (7.27–8.59)
purchase-plan21.62 (20.59–25.16)23.00 (20.11–25.44)1038.86 (1027.37–1067.43)1060.89 (1006.98–1234.65)7.20 (6.71–7.77) / 7.34 (7.00–8.32)

B3 disposition: runtime code was restored byte-for-byte to the already validated B2 pricing implementation. No unused cache remains. To reproduce the rejected experiment, check out its preceding commit and run the retained scripts/perf/count-repricing-cache.mjs battery-study instrumentation. The next B4 measurements compare against B2, which is the identical runtime baseline.

B4

Remove emptied rolling-cache tracking lists from the strong Set; register reused lists again and release session representatives only when no future-contract entries remain. Retained advice schedules and other-contract entries are unchanged; repeated release/rebuild is covered. All 198 tests, golden, lint/type/format and deployments pass. One new regression initially had a duplicate local name; it was corrected without weakening assertions. Because that short test overlapped the last timing round, the entire fifth round was resampled after all checks completed; superseded raw samples remain marked and are excluded. No total-time or RSS improvement is claimed unless larger than both observed spreads. The baseline is B2, since B3 runtime was restored exactly.

ScenarioBefore seconds (min–max)After seconds (min–max)Before RSS MiB (min–max)After RSS MiB (min–max)Before / after GC % (min–max)
dynamic-ev-battery18.69 (17.77–20.62)18.63 (18.21–19.50)992.67 (987.46–1046.93)985.24 (967.53–994.85)7.00 (6.73–7.28) / 6.76 (6.57–7.18)
battery-study8.31 (7.53–9.66)7.86 (7.69–8.96)833.24 (806.93–853.88)850.03 (826.34–882.06)8.32 (7.60–9.79) / 7.98 (7.57–8.15)
purchase-plan21.62 (20.59–25.16)22.32 (20.67–23.88)1038.86 (1027.37–1067.43)1049.61 (997.78–1070.13)7.20 (6.71–7.77) / 7.27 (7.00–7.73)

Eindstand vóór de presentatieaanpassingen van C

ScenarioBaseline mediaan sEindmediaan sBaseline/eind piek-RSS mediaan MiBBaseline/eind GC mediaan %
dynamic-ev-battery21.1218.63986.5 / 985.28.87 / 6.76
battery-study9.837.86817.8 / 850.09.32 / 7.98
purchase-plan25.8122.321050.6 / 1049.69.19 / 7.27

Alle medianen en min–maxspreidingen per tussenstap staan hierboven en in abc-five-runs.json. Lagere medianen leveren hier geen bewezen forse totale versnelling op: verschillen blijven kleiner dan de baseline-spreiding. Het piekgeheugen blijft rond één GiB voor de zwaarste scenario's. Dit mobiele risico is dus niet opgelost. De nulmeting van deze machine gebruikt Node 24; de eerder aangeleverde Node 22-auditcijfers zijn geen rechtstreekse vergelijkingsbasis.

De extra herprijzingscache is bewust verwijderd na nul treffers. De bestaande cache voor maandkalenders/afrekeningen blijft staan. De bestaande convexe Monge-versnelling in de DP is niet nogmaals vervangen: dit was laagste prioriteit en een nieuwe solver brengt risico voor exacte tie-breaking mee. Geen financiële regel, tariefbestand of golden-referentie is gewijzigd. De volledige reeks batterijgroottes blijft beschikbaar; het aantal DP-oproepen is niet gereduceerd.

Metingen zijn Node-/synthetische analysemetingen, geen mobiele browsermetingen. De CPU-profielen zijn gemaakt met V8 Inspector op 1 ms, niet met de CLI-vlag --cpu-prof. Er wordt geen claim gemaakt over iOS-geheugen, mobiele time-to-result, Lighthouse of Long Tasks op basis van deze Node-cijfers.

C — vernieuwing en presentatie

grootte, URL/redirects, bestaande V-test/netparsers, productaantallen, eindige tarieven, gasgrenzen en twaalf curvemaanden met Belgische klokwissels.

curve november, stroom- en gasnettarieven 2026 en de Fluvius-gemeentemapping. Alles bleef een voorstel buiten de canonieke appdata. De oude oktobercurve opnieuw importeren geeft maximaal 1,99e-13 EUR/MWh afrondingsverschil per maand.

geven geen nieuwe waarnemingsdatum of PR, ook niet alleen door een andere URL. Een lokale Git-smoketest controleert de expliciete lease vanuit een single-branch checkout en bescherming tegen gelijktijdige edits. De echte GitHub-hosted workflow, repositoryrechten en PR-aanmaak zijn niet uitgevoerd: deze checkout heeft een Sites-bronrepository, geen GitHub Actions-runner.

Een ontbrekende gas-bijwerkdatum blijft expliciet onbekend. Geen nieuwe browserrequests. Datumtest alleen via ?debug=1; bestaande actieve simulatie behoudt waarschuwing en reset. Uur-/dagimportmelding noemt jaarverbruik als alternatief. De UTC-maandgrens en harde stale-curve-weigering blijven intact.

formatcontrole slagen. Lint/typecheck houden de bestaande auditbaseline aan (738/492 bestaande meldingen, nul nieuwe groepen). De suite controleert de drie deployments en byte-identieke Pages-builds. Een nieuwe dataversietekst werd na de bestaande 'geen gas'-guard geplaatst; de bestaande regressietest bleef ongewijzigd. Een eerder voortijdig geëindigde lange controleketen is vervangen door een volledig afgeronde zelfstandige testuitvoering.

?debug=1 toont de datumtest; bronnenpagina toont oktober en echte bestaande bijwerkdata. Visueel de desktopinstellingen bekeken. Geen claim over iOS, Android, Firefox, 360-px layout, throttled browserperformance of echte Home Assistant-installatie: die zijn in deze ronde niet getest.

Brononderzoek, voorwaarden, handmatige heffingencheck en review-/releaseproces: docs/data-renewal.md. Open keuze: eventuele vorige-maandcurve met Brusselse maandgrens en coulance tot dag vijf of zeven. Niet geïmplementeerd zonder akkoord. Voor exacte batterijzoekruimte is geen stopdrempel geselecteerd.