[Prestaties][P0] Split-run-index meet bij elke toetsaanslag alle runleden opnieuw (136–535 ms per toets) #2620
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#2620
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 een grote presentatie met lange, over meerdere dia's verdeelde lijsten ("Splits slide", of geïmporteerde PowerPoint-decks) wordt typen merkbaar traag — ook als je in een dia typt die niets met die reeksen te maken heeft.
Oorzaak
splitRunLayoutIndex(lib/services/split_run.dart:190) cachet de index in eenExpandoop de dialijst (regel 196). Elke bewerking levert viadeck.copyWith(slides: …)een nieuwe lijst, dus na elke toetsaanslag mist de cache en bouwtbuildSplitRunLayoutIndex(regel 226) de hele index opnieuw — inclusief een volledige TextPainter-inpassing (splitRunMemberScale) van elk lid van elke reeks. De eerste diaminiatuur die daarna bouwt betaalt dat (lib/widgets/panels/slide_list_panel.dart:534), en preview, overzicht en presentator lezen dezelfde index.#1051 maakte de index per deckrevisie; dat lost herhaling bínnen één revisie op, maar niet tussen twee toetsaanslagen. De kwaliteitscontrole memoiseert exact dezelfde meting wél per dia (
_memoizedRunScale,lib/services/slide_quality/slide_quality_analyzer_density.dart:561), de index niet.Meting
Tijdelijke meetproef (debug-JIT, Apple Silicon), één herbouw met een nieuwe lijst — dus precies wat één toetsaanslag kost:
Lineair in het aantal runleden, maar dat aantal wordt per toetsaanslag volledig betaald.
Voorgestelde oplossing
Memoiseer de per-lid-meting per dia (immutable, identiteit) in plaats van per lijst: één gedeelde
Expando<Slide>met sleutel (profiel-identiteit, font, diaverhouding), gebruikt door zowelbuildSplitRunLayoutIndexals de kwaliteitscontrole (één functie, bv.memoizedSplitRunMemberScale). Na een toetsaanslag wordt dan alleen de gewijzigde dia opnieuw gemeten; de rest van de index is een goedkope lineaire gang.Wat overeind moet blijven
Dezelfde gedeelde schaal per reeks op alle oppervlakken (strook, preview, presentator, beamer, export) — de bestaande tests in
test/shared_split_fit_scale_test.dartblijven groen.Toets
Uitbreiding van
test/shared_split_fit_scale_test.dart: reeks van 150 pagina's, vervang één dia (nieuwe lijst) →measureMemberwordt één keer aangeroepen, niet 150 keer.Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).