Typen in documenten met risicotabellen is traag: kwaliteitsscan decodeert tabellen kwadratisch bij elke rebuild #2710

Closed
opened 2026-11-02 21:52:00 +00:00 by brenno · 0 comments
Owner

Probleem

Bij het typen in een document met ocideck:-contracttabellen (bijv. een FMEA-risicoanalyse) hapert de invoer. Gemeten op een synthetisch FMEA-document (~54 KB, 40 risicori × 16 kolommen, 2 gekoppelde weergaven, 1 calc):

  • riskQualityFindings(source) kost ~85 ms en draait synchroon in _docToolbar bij elke scherm-rebuild — dus zowel per caret-debounce (~160 ms) als per bron-flush (~300 ms) tijdens typen.
  • Binnen die scan decodért OciMarkedTable.bodyRows/contractRows/decodedRows de hele tabel bij elke aanroep. Lussen als for (i < table.bodyRows.length) met table.contractRows[i] per rij zijn daardoor O(rijen² × kolommen). Dezelfde kwadratische decodering zit in risk_view, risk_dossier, risk_bowtie, risk_bowtie_diagram en risk_calc.

Oplossing

  1. OciMarkedTable: de gedecodeerde rijen lazily memoiseren (één decode per tabel i.p.v. per toegang) — herstelt de lineaire kostenklasse voor alle aanroepers.
  2. De werkbalk-badge herberekent de bevindingen niet synchroon in build maar gedebounced bij bronwijziging, zodat doortypen geen volledige dossierscan per rebuild kost.
## Probleem Bij het typen in een document met `ocideck:`-contracttabellen (bijv. een FMEA-risicoanalyse) hapert de invoer. Gemeten op een synthetisch FMEA-document (~54 KB, 40 risicori × 16 kolommen, 2 gekoppelde weergaven, 1 calc): - `riskQualityFindings(source)` kost **~85 ms** en draait **synchroon in `_docToolbar` bij elke scherm-rebuild** — dus zowel per caret-debounce (~160 ms) als per bron-flush (~300 ms) tijdens typen. - Binnen die scan decodért `OciMarkedTable.bodyRows`/`contractRows`/`decodedRows` de hele tabel **bij elke aanroep**. Lussen als `for (i < table.bodyRows.length)` met `table.contractRows[i]` per rij zijn daardoor O(rijen² × kolommen). Dezelfde kwadratische decodering zit in `risk_view`, `risk_dossier`, `risk_bowtie`, `risk_bowtie_diagram` en `risk_calc`. ## Oplossing 1. `OciMarkedTable`: de gedecodeerde rijen lazily memoiseren (één decode per tabel i.p.v. per toegang) — herstelt de lineaire kostenklasse voor alle aanroepers. 2. De werkbalk-badge herberekent de bevindingen niet synchroon in build maar gedebounced bij bronwijziging, zodat doortypen geen volledige dossierscan per rebuild kost.
brenno 2026-11-02 22:05:41 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2710
No description provided.