[Prestaties][P1] Markdown-bron: schrijftips-scan over het hele deck bij elke toetsaanslag (18/37/75 ms bij 150/300/600 dia's) #2681

Closed
opened 2026-10-31 09:47:40 +00:00 by brenno · 4 comments
Owner

Symptoom

Typen in de Markdown-bron van een groot deck (Bron-modus, bereik "hele deck") hapert. Bij 150 dia's kost elke toetsaanslag al meer dan een frame.

Gemeten

Losse AOT-meting (dart compile exe, Apple Silicon) van inspectMarkdownWriting op een synthetisch deck van 6 bullets per dia, gemiddeld over 20 runs:

dia's bron inspectMarkdownWriting reparse ter vergelijking
150 97 KiB 18,4 ms 0,9 ms
300 195 KiB 37,3 ms 1,7 ms
600 391 KiB 74,9 ms 3,6 ms

De RegExp-constructies naar top-level halen scheelt minder dan 5 % (71 ms bij 600 dia's): de VM cachet ze al. De kosten zitten in de scan zelf, die lineair over de hele tekst loopt.

Oorzaak

_onDocumentChanged (lib/widgets/editors/markdown_deck_editor.dart:250-266) draait bij elke wijziging inspectMarkdownWriting(_ctrl.text) (lib/models/markdown_writing_suggestion.dart:18) over de volledige bron. De uitkomst voedt alleen een teller in de balk (r. 949) en de dialoog Schrijftips. De validatie ernaast is wél gedebounced (350 ms, r. 281-285).

Voorgestelde oplossing

  1. Bereken de schrijftips in dezelfde debounce als de validatie (_scheduleValidation). De dialoog rekent bij het openen vers.
  2. Niet nodig voor de fix, wel mogelijk: per blok memoiseren via MarkdownSourceDocument, zodat alleen gewijzigde blokken opnieuw geïnspecteerd worden.
  3. Bijvangst in dezelfde functie: de meldingsteksten zijn hardgecodeerd Nederlands ('Het woord “…” staat twee keer achter elkaar.' en de twee andere, r. 45, 57, 66). Via Text(suggestion.message) (markdown_deck_editor.dart:610) verschijnen ze zo in alle UI-talen. Maak er kind plus argumenten van en vertaal bij de weergave met l10n.d.

Wat overeind moet blijven

  • De teller verschijnt nog steeds, hooguit 350 ms later, en Schrijftips toont de actuele lijst.
  • Een klik op een tip springt nog steeds naar de regel.

Toets

Een per-toetsaanslag-toets naast de schaalpoorten uit #2636: 600 dia's en één aanslag geeft geen aanroep van inspectMarkdownWriting binnen het debounce-venster (teller-naad). Daarna verschijnt de teller.

Gevonden en gemeten tijdens de vervolginspectie van 31-10-2026. Niet gedekt door EPIC #2637; #2562 ging over de regelnummers.

## Symptoom Typen in de Markdown-bron van een groot deck (Bron-modus, bereik "hele deck") hapert. Bij 150 dia's kost elke toetsaanslag al meer dan een frame. ## Gemeten Losse AOT-meting (`dart compile exe`, Apple Silicon) van `inspectMarkdownWriting` op een synthetisch deck van 6 bullets per dia, gemiddeld over 20 runs: | dia's | bron | `inspectMarkdownWriting` | `reparse` ter vergelijking | |---|---|---|---| | 150 | 97 KiB | 18,4 ms | 0,9 ms | | 300 | 195 KiB | 37,3 ms | 1,7 ms | | 600 | 391 KiB | 74,9 ms | 3,6 ms | De RegExp-constructies naar top-level halen scheelt minder dan 5 % (71 ms bij 600 dia's): de VM cachet ze al. De kosten zitten in de scan zelf, die lineair over de hele tekst loopt. ## Oorzaak `_onDocumentChanged` (`lib/widgets/editors/markdown_deck_editor.dart:250-266`) draait bij elke wijziging `inspectMarkdownWriting(_ctrl.text)` (`lib/models/markdown_writing_suggestion.dart:18`) over de volledige bron. De uitkomst voedt alleen een teller in de balk (r. 949) en de dialoog *Schrijftips*. De validatie ernaast is wél gedebounced (350 ms, r. 281-285). ## Voorgestelde oplossing 1. Bereken de schrijftips in dezelfde debounce als de validatie (`_scheduleValidation`). De dialoog rekent bij het openen vers. 2. Niet nodig voor de fix, wel mogelijk: per blok memoiseren via `MarkdownSourceDocument`, zodat alleen gewijzigde blokken opnieuw geïnspecteerd worden. 3. Bijvangst in dezelfde functie: de meldingsteksten zijn hardgecodeerd Nederlands (`'Het woord “…” staat twee keer achter elkaar.'` en de twee andere, r. 45, 57, 66). Via `Text(suggestion.message)` (`markdown_deck_editor.dart:610`) verschijnen ze zo in alle UI-talen. Maak er `kind` plus argumenten van en vertaal bij de weergave met `l10n.d`. ## Wat overeind moet blijven - De teller verschijnt nog steeds, hooguit 350 ms later, en *Schrijftips* toont de actuele lijst. - Een klik op een tip springt nog steeds naar de regel. ## Toets Een per-toetsaanslag-toets naast de schaalpoorten uit #2636: 600 dia's en één aanslag geeft geen aanroep van `inspectMarkdownWriting` binnen het debounce-venster (teller-naad). Daarna verschijnt de teller. Gevonden en gemeten tijdens de vervolginspectie van 31-10-2026. Niet gedekt door EPIC #2637; #2562 ging over de regelnummers.
Author
Owner

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: de bestanden die in de oorzaak van dit issue staan, plus een regressietest.

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: de bestanden die in de oorzaak van dit issue staan, plus een regressietest.
Author
Owner

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: lib/widgets/editors/markdown_deck_editor.dart, lib/models/markdown_writing_suggestion.dart, vertalingen.

Opgepakt. Tak: fix/vervolginspectie-3110. Verwachte reikwijdte: lib/widgets/editors/markdown_deck_editor.dart, lib/models/markdown_writing_suggestion.dart, vertalingen.
Author
Owner

Staat op main in a6b4dc066 (5f16e8917). Schrijftips wachten dezelfde adempauze als de syntaxcontrole. De meldingen lopen via de vertaling.

Staat op main in a6b4dc066 (5f16e8917). Schrijftips wachten dezelfde adempauze als de syntaxcontrole. De meldingen lopen via de vertaling.
Author
Owner

Opgelost op main in a6b4dc066. De zin „elke toetsaanslag kost al meer dan een frame“ is gedekt doordat de schrijftips in dezelfde adempauze als de validatie lopen (lib/widgets/editors/markdown_deck_editor.dart) en de zinnen via l10n.d gaan. De toets met 600 dia's en één aanslag staat in test/markdown_deck_editor_test.dart.

Opgelost op main in a6b4dc066. De zin „elke toetsaanslag kost al meer dan een frame“ is gedekt doordat de schrijftips in dezelfde adempauze als de validatie lopen (lib/widgets/editors/markdown_deck_editor.dart) en de zinnen via l10n.d gaan. De toets met 600 dia's en één aanslag staat in test/markdown_deck_editor_test.dart.
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#2681
No description provided.