[Prestaties][P0] Documentmodus: elke toetsaanslag zet het hele document om naar Markdown, superlineair (256 ms bij 300 p.) #2621
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2621
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom
In de visuele documentmodus wordt typen bij grotere documenten (rapporten van tientallen pagina's, veel tabellen en genummerde lijsten) steeds stroever; de vertraging groeit sneller dan het document.
Oorzaak
Bij élke wijziging in de Quill-editor zet
_flushPendingQuillChange(lib/widgets/markdown_editor/markdown_editor.dart:604-622, ingepland viascheduleMicrotaskop regel 601) het hele document om naar Markdown:MarkdownQuillCodec.markdownFromDocument(regel 614). Een microtask draait vóór het volgende frame, dus deze kosten zitten integraal in de toetsaanslag. Daarna volgen nogwithSource→MarkdownSourceDocument.reparseen een paar volledige stringvergelijkingen (die zijn goedkoop, ~2 ms bij 150 pagina's).De omzetting zelf is superlineair:
DeltaToMarkdown.convertbouwt eerst een compleet nieuwDocument.fromDelta(...)(third_party/markdown_quill/lib/src/delta_to_markdown.dart:83), terwijl de aanroeper al eenDocumentheeft._prefixNumbereen platte lijst van het hele document (_toDocumentList(root), regel 463) en zoekt de node metindexOf— O(lijstitems × documentlengte).Meting
Tijdelijke meetproef (debug-JIT, Apple Silicon; document met koppen, alinea's met opmaak/links, opsommingen en elke twee pagina's een tabel van 8×4):
markdownFromDocumentper toetsaanslagTwee keer zoveel pagina's kost 2,5–3,4× zoveel tijd. Openen in de visuele stand (
documentFromMarkdown) kost 160 ms bij 150 en 437 ms bij 300 pagina's.Voorgestelde oplossing
_visualEdited/dirty meteen zetten (zoals nu), maar de omzetting pas na een korte rustpauze (250–400 ms) doen, plus een verplichteflushop elk punt dat de bron nodig heeft: opslaan, autosave-tik/herstelmomentopname, wisselen naar Bron, export, presenteren, zoeken/vervangen openen, tabblad wisselen/sluiten, afsluiten. Er is al eenflush: true-pad bij de moduswissel (_closeVisualEditor); maak er éénflushPendingVisualEdit()van die de documentlaag aanroept vóór hijsourceleest._prefixNumberlineair maken: bereken de nummering één keer perconvert(één gang door het document,Map<Node, int>), in plaats van per item het hele document af te lopen. Het pakket staat inthird_party/, dus dat kan hier.Documentbouwen: eenconvertDocument(Document)-ingang die direct op de bestaande boom loopt.RenderEditorop, zonder virtualisatie. Voor documenten boven een drempel (bv. 150 pagina's) is per-sectie visueel bewerken of standaard Bron-modus het overwegen waard.Wat overeind moet blijven
Byte-getrouwe opslag (#1613/#1648), ongedaan maken per bewerking (coalescing op
'doc'), en dat een cursorbeweging geen bewerking is (#2141-lijn).Toets
test/large_deck_performance_test.dart:markdownFromDocumentop 300 pagina's kost < 2,5× die op 150 pagina's (zelfde opzet als de bestaande parse-verhoudingstest).Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).
Opgepakt. Tak: fix/prestatie-2635-2621-2622-2625. Verwachte reikwijdte: lib/widgets/markdown_editor/markdown_editor.dart, third_party/markdown_quill/lib/src/delta_to_markdown.dart en de flush-aanroepen vóór bronlezing. Virtualisatie van de Quill-editor blijft apart.