[EPIC] Prestatie- en stabiliteitsinspectie 28-10-2026: traag bij groot, start niet, loopt vast #2637

Closed
opened 2026-10-28 16:32:34 +00:00 by brenno · 1 comment
Owner

Aanleiding

Er blijven klachten komen dat OciDeck bij grotere documenten, grotere presentaties en veel tabellen traag is, en dat de app "regelmatig niet opstart of soms vastloopt terwijl ik er in werk" (melding van een gebruiker op Windows 10). Die meldingen zijn te vaag om direct op te bouwen. Deze inspectie (28-10-2026) heeft de code doorgelicht en de verdachte paden gemeten, zonder code te wijzigen.

Ligt het aan Windows 10?

Niet aan Windows 10 als zodanig: dat is een ondersteund platform (MinVersion=10.0 in de installer, manifest voor Windows 10/11). Wél valt een aantal zwakke plekken op Windows harder of uitsluitend daar op:

  • synchrone bestandssysteemaanroepen op de UI-thread (elke open passeert daar de virusscanner en, in OneDrive-mappen, de cloud-filter) — #2624, #2626;
  • het instellingenbestand dat op Windows niet atomair wordt geschreven — #2628;
  • geen enkel-exemplaarbewaking (macOS regelt dat zelf, Windows niet) — #2627;
  • de Visual C++-runtime die niet wordt meegeleverd — #2630;
  • het venster dat op Windows pas verschijnt bij het eerste frame, zodat elke vertraging vóór dat frame eruitziet als "start niet" — #2626;
  • en simpelweg tragere hardware, die alle UI-blokkades hieronder 2–4× langer maakt.

De belangrijkste oorzaak van "vastlopen tijdens het werk" is platformonafhankelijk: werk dat synchroon op de UI-isolate draait (#2619, #2621, #2629) en werk dat bij élke toetsaanslag opnieuw over het hele deck loopt (#2620, #2622, #2623).

Eerst: zorg dat we het kúnnen zien

#2618 — release-builds loggen niets. Zonder lokaal logbestand, opstartmijlpalen en een UI-stallmelder blijft elke volgende melding even vaag. Dit is de eerste stap, omdat het ook de prioriteiten hieronder op echte Windows-gegevens kan zetten.

De issues, op volgorde van verwachte impact

# Prio Wat Gemeten / bewijs
#2618 P0 Geen logbestand in release 799 log-aanroepen gaan in release verloren
#2619 P0 Gezichtsdetectie synchroon op de UI-thread, standaard aan, start bij typen opnieuw 41 / 74 / 99 ms per foto (1080p / 12 MP / 24 MP) op Apple Silicon
#2620 P0 Split-run-index herbouwt per toetsaanslag 136 ms (50 runleden) – 535 ms (200) per toets
#2621 P0 Documentmodus: Quill→Markdown per toetsaanslag, superlineair 30 / 75 / 256 ms bij 75 / 150 / 300 pagina's
#2622 P1 LRU-klif boven 512 dia's 500 dia's 0,4 ms → 520 dia's 386 ms per toets
#2623 P1 Hele AppShell + miniaturen + macOS-menu per toetsaanslag codeanalyse
#2624 P1 Twee synchrone realpath-aanroepen per afbeelding per build 19 µs/aanroep op macOS; Windows te meten
#2625 P1 Foto's op bronresolutie gedecodeerd op elk oppervlak ~45 MB per 24 MP-foto per oppervlak
#2626 P1 Synchroon werk vóór het eerste frame (= vóór het venster op Windows) lexicon 57 ms; stagingwandeling groeit met gebruik
#2627 P1 Geen enkel-exemplaarbewaking op Windows codeanalyse
#2628 P1 Instellingenbestand niet atomair, geen herstel bij beschadiging broncode shared_preferences_windows 2.4.1
#2629 P1 Documentexport op de UI-isolate codeanalyse
#2636 P1 Poort: schaal- en per-toetsaanslagtoetsen, Windows-meting —
#2630 P2 Visual C++-runtime niet meegeleverd rookproef draait op een machine mét Visual Studio
#2631 P2 Afsluiten kan hangen of stil mislukken codeanalyse
#2632 P2 TextPainters niet vrijgegeven tableFit 0,7 / 2,6 / 5,0 ms voor 8 / 20 / 40 rijen
#2633 P2 Automatisch doorspelen herbouwt presentator 20×/s codeanalyse
#2634 P2 Koude analyse bij openen groot deck 655 + 450 ms bij 600 dia's
#2635 P3 AI-statuscontrole stopt na instellingswijziging codeanalyse

Voorgestelde volgorde: #2618 → #2619 → #2620 → #2621 (deze vier geven samen de grootste winst voor "traag bij groot" en "loopt vast"), daarna #2622/#2623/#2624 (allemaal "per toetsaanslag"), dan de Windows-robuustheid (#2626, #2627, #2628, #2630) en #2636 zodat het niet terugkomt.

Hoe er gemeten is

  • Tijdelijke meetproeven (niet gecommit) met flutter test in debug-JIT op een Mac met Apple Silicon; de native gezichtsscan via een tijdelijke integration_test op macOS. Release-AOT is sneller dan debug-JIT, een gemiddelde Windows 10-laptop trager dan deze Mac; de cijfers zijn dus een orde van grootte, en vooral de verhoudingen zeggen iets (lineair vs. superlineair, klif bij 512).
  • Wat al goed is en dus geen issue kreeg: parsen en serialiseren van decks (150 dia's: 5 ms / 0,5 ms; 600: 16 ms / 1,8 ms), de autosave-momentopname elke 25 s, de kwaliteitsanalyse per dia na de eerste keer (Expando-memo), tabelinpassing per breedte (gememoiseerd), de presentatie-exports (al in een isolate), de beamersynchronisatie (alleen de toestand, niet het deck), en alle begrensde while (true)-lussen.

Bewust niet opgenomen

  • Mermaid en wiskunde renderen op Windows en Linux niet (geen WebView-implementatie); dat staat al in docs/KNOWN_LIMITATIONS.nl.md en is een functie-, geen prestatievraag.
  • De bibliotheekscan over Documenten/Bureaublad leest de kop van elk .md-bestand, wat in OneDrive-mappen "alleen online"-bestanden kan laten downloaden. Die scan start de gebruiker zelf, is begrensd en af te breken; eerst meten met #2618 voordat er iets aan gebeurt.
  • De visuele documenteditor (flutter_quill) virtualiseert niet; genoemd als vervolgstap in #2621.
## Aanleiding Er blijven klachten komen dat OciDeck bij grotere documenten, grotere presentaties en veel tabellen traag is, en dat de app "regelmatig niet opstart of soms vastloopt terwijl ik er in werk" (melding van een gebruiker op Windows 10). Die meldingen zijn te vaag om direct op te bouwen. Deze inspectie (28-10-2026) heeft de code doorgelicht en de verdachte paden gemeten, zonder code te wijzigen. ## Ligt het aan Windows 10? Niet aan Windows 10 als zodanig: dat is een ondersteund platform (`MinVersion=10.0` in de installer, manifest voor Windows 10/11). Wél valt een aantal zwakke plekken op Windows harder of uitsluitend daar op: - synchrone bestandssysteemaanroepen op de UI-thread (elke `open` passeert daar de virusscanner en, in OneDrive-mappen, de cloud-filter) — #2624, #2626; - het instellingenbestand dat op Windows niet atomair wordt geschreven — #2628; - geen enkel-exemplaarbewaking (macOS regelt dat zelf, Windows niet) — #2627; - de Visual C++-runtime die niet wordt meegeleverd — #2630; - het venster dat op Windows pas verschijnt bij het eerste frame, zodat elke vertraging vóór dat frame eruitziet als "start niet" — #2626; - en simpelweg tragere hardware, die alle UI-blokkades hieronder 2–4× langer maakt. De belangrijkste oorzaak van "vastlopen tijdens het werk" is platformonafhankelijk: werk dat synchroon op de UI-isolate draait (#2619, #2621, #2629) en werk dat bij élke toetsaanslag opnieuw over het hele deck loopt (#2620, #2622, #2623). ## Eerst: zorg dat we het kúnnen zien **#2618** — release-builds loggen niets. Zonder lokaal logbestand, opstartmijlpalen en een UI-stallmelder blijft elke volgende melding even vaag. Dit is de eerste stap, omdat het ook de prioriteiten hieronder op echte Windows-gegevens kan zetten. ## De issues, op volgorde van verwachte impact | # | Prio | Wat | Gemeten / bewijs | |---|---|---|---| | #2618 | P0 | Geen logbestand in release | 799 log-aanroepen gaan in release verloren | | #2619 | P0 | Gezichtsdetectie synchroon op de UI-thread, standaard aan, start bij typen opnieuw | 41 / 74 / 99 ms per foto (1080p / 12 MP / 24 MP) op Apple Silicon | | #2620 | P0 | Split-run-index herbouwt per toetsaanslag | 136 ms (50 runleden) – 535 ms (200) per toets | | #2621 | P0 | Documentmodus: Quill→Markdown per toetsaanslag, superlineair | 30 / 75 / 256 ms bij 75 / 150 / 300 pagina's | | #2622 | P1 | LRU-klif boven 512 dia's | 500 dia's 0,4 ms → 520 dia's 386 ms per toets | | #2623 | P1 | Hele AppShell + miniaturen + macOS-menu per toetsaanslag | codeanalyse | | #2624 | P1 | Twee synchrone realpath-aanroepen per afbeelding per build | 19 µs/aanroep op macOS; Windows te meten | | #2625 | P1 | Foto's op bronresolutie gedecodeerd op elk oppervlak | ~45 MB per 24 MP-foto per oppervlak | | #2626 | P1 | Synchroon werk vóór het eerste frame (= vóór het venster op Windows) | lexicon 57 ms; stagingwandeling groeit met gebruik | | #2627 | P1 | Geen enkel-exemplaarbewaking op Windows | codeanalyse | | #2628 | P1 | Instellingenbestand niet atomair, geen herstel bij beschadiging | broncode `shared_preferences_windows` 2.4.1 | | #2629 | P1 | Documentexport op de UI-isolate | codeanalyse | | #2636 | P1 | Poort: schaal- en per-toetsaanslagtoetsen, Windows-meting | — | | #2630 | P2 | Visual C++-runtime niet meegeleverd | rookproef draait op een machine mét Visual Studio | | #2631 | P2 | Afsluiten kan hangen of stil mislukken | codeanalyse | | #2632 | P2 | TextPainters niet vrijgegeven | `tableFit` 0,7 / 2,6 / 5,0 ms voor 8 / 20 / 40 rijen | | #2633 | P2 | Automatisch doorspelen herbouwt presentator 20×/s | codeanalyse | | #2634 | P2 | Koude analyse bij openen groot deck | 655 + 450 ms bij 600 dia's | | #2635 | P3 | AI-statuscontrole stopt na instellingswijziging | codeanalyse | **Voorgestelde volgorde:** #2618 → #2619 → #2620 → #2621 (deze vier geven samen de grootste winst voor "traag bij groot" en "loopt vast"), daarna #2622/#2623/#2624 (allemaal "per toetsaanslag"), dan de Windows-robuustheid (#2626, #2627, #2628, #2630) en #2636 zodat het niet terugkomt. ## Hoe er gemeten is - Tijdelijke meetproeven (niet gecommit) met `flutter test` in debug-JIT op een Mac met Apple Silicon; de native gezichtsscan via een tijdelijke `integration_test` op macOS. Release-AOT is sneller dan debug-JIT, een gemiddelde Windows 10-laptop trager dan deze Mac; de cijfers zijn dus een orde van grootte, en vooral de **verhoudingen** zeggen iets (lineair vs. superlineair, klif bij 512). - Wat al goed is en dus geen issue kreeg: parsen en serialiseren van decks (150 dia's: 5 ms / 0,5 ms; 600: 16 ms / 1,8 ms), de autosave-momentopname elke 25 s, de kwaliteitsanalyse per dia na de eerste keer (Expando-memo), tabelinpassing per breedte (gememoiseerd), de presentatie-exports (al in een isolate), de beamersynchronisatie (alleen de toestand, niet het deck), en alle begrensde `while (true)`-lussen. ## Bewust niet opgenomen - Mermaid en wiskunde renderen op Windows en Linux niet (geen WebView-implementatie); dat staat al in `docs/KNOWN_LIMITATIONS.nl.md` en is een functie-, geen prestatievraag. - De bibliotheekscan over Documenten/Bureaublad leest de kop van elk `.md`-bestand, wat in OneDrive-mappen "alleen online"-bestanden kan laten downloaden. Die scan start de gebruiker zelf, is begrensd en af te breken; eerst meten met #2618 voordat er iets aan gebeurt. - De visuele documenteditor (flutter_quill) virtualiseert niet; genoemd als vervolgstap in #2621.
Author
Owner

Alle kinderen uit de inspectietabel zijn geland — deze epic kan dicht.

Blijft open als eigen vervolg: #2657 — Windows time-to-first-frame meten en een plafond zetten. Dat vereist echte Windows-hardware (geen VM-snapshot) en is bewust geen onderdeel van deze epic meer: het meetpunt uit #2618 ligt er nu, de meting zelf is hardware-afhankelijk.

Alle kinderen uit de inspectietabel zijn geland — deze epic kan dicht. - **#2618** (logbestand, opstartmijlpalen, stallmelder, sessiemarkering, diagnose-UI): PR #2654, merge `709e9ba77b`. - **#2619, #2620, #2622, #2624, #2625, #2629** (werk van de UI-isolate / per toetsaanslag): PR #2664. - **#2621** (Quill→Markdown gedebounced + convertDocument): PR #2664. - **#2623** (presentator-herbouwen via ValueNotifiers): PR #2664. - **#2626** (huishouding ná eerste frame, opstartwaakhond): PR #2664. - **#2627** (enkel-exemplaar): Linux via #2656 (PR #2665); Windows natief in de runner; macOS via het OS. - **#2628** (atomaire instellingen + quarantaine): PR #2664. - **#2630, #2631, #2632, #2633, #2634, #2635**: PR #2664. - **#2636** (schaal- en per-toetsaanslagpoort): PR #2654-reeks / #2664; de Windows-meting is uitgesplitst. **Blijft open als eigen vervolg:** #2657 — Windows time-to-first-frame meten en een plafond zetten. Dat vereist echte Windows-hardware (geen VM-snapshot) en is bewust geen onderdeel van deze epic meer: het meetpunt uit #2618 ligt er nu, de meting zelf is hardware-afhankelijk.
brenno 2026-10-29 15:23:17 +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#2637
No description provided.