Suche fühlt sich träge an — Rückmeldung fehlt, Poster blockieren den Eindruck #3
Notifications
Total Time Spent: 7 minutes
florian.wilde
7 minutes
No due date set.
Dependencies
No dependencies set.
Reference: florian.wilde/flimmer#3
Reference in New Issue
Block a user
Beobachtung
Beim Tippen in der Suche dauert es produktiv „ein paar Sekunden", bis Treffer erscheinen. Die Suche filtert bereits live (kein Enter nötig), aber sie wirkt stehengeblieben.
Was gemessen ist
Die Datenbank ist es nicht. Gegen die Entwicklungsinstanz, Median aus 12 Läufen bei 18 Bibliothekseinträgen:
getLibrary()ohne FiltergetLibrary()mit SuchbegriffgetLibraryFacets()Serverseitig kostet ein Tastendruck also rund 50 ms. Die wahrgenommenen Sekunden entstehen woanders.
Wo die Zeit vermutlich hingeht
Nach Auffälligkeit sortiert, noch nicht am Produktivsystem verifiziert:
Poster beim ersten Aufruf. Jedes Poster läuft über
/api/image. Bei einem Cache-Fehltreffer holt der Server das Bild synchron von TMDB, bevor er antwortet — bei zwanzig Treffern zwanzig ausgehende Anfragen. Der Text steht dann längst da, aber die Seite sieht unfertig aus. Bei einer zweiten Suche nach demselben Begriff sind die Bilder im Cache und es geht sofort. Das passt zum Eindruck „mal schnell, mal Sekunden".TMDB-Abruf je Suchbegriff.
/suchefragt TMDB an; von Deutschland aus je nach Verbindung 200–500 ms. Wiederholungen kommen zehn Minuten lang aus dem Zwischenspeicher.Volle Serverrunde je Eingabe. 350 ms Verzögerung nach dem Tippen (
/suche) bzw. 300 ms (Bibliothek), dann eine RSC-Anfrage über die Leitung. Über das Internet zu einer eigenen Instanz kommen leicht nochmal einige hundert Millisekunden dazu.Fehlende Rückmeldung in der Bibliothek.
/suchezeigt beim Tippen ein kleines „sucht …". Die Filterleiste der Bibliothek zeigt gar nichts — dort bleiben die alten Treffer sichtbar, bis die neuen da sind. Ohne Signal wirkt das wie Stillstand.Vorschlag
Zuerst messen, dann bauen. Am Produktivsystem im Netzwerk-Tab nachsehen, wie lange die Navigationsanfrage braucht und wie lange die
/api/image-Anfragen. Danach gezielt:getLibraryFacets()hängt nicht vom Suchbegriff ab, läuft aber bei jeder Navigation mit. Bei 18 Einträgen sind das 16 ms, bei einer großen Bibliothek mitDISTINCT unnestüber alle Genres deutlich mehr.Abnahme
Angelegt auf ausdrücklichen Wunsch direkt in Gitea, ohne Verknüpfung zu einem Nebula-Task.
🤖 Claude Code hat mit der Umsetzung begonnen.
fix/3-suche-rueckmeldungconst [, startTransition] = useTransition()(src/components/library/LibraryFilters.tsx:29). DasisPendingdaraus nutzen, dazu das Trefferraster während des Ladens dämpfen — in/suchegenauso.SearchField) und 300 ms (Bibliothek) angleichen und senken.Was ich hier nicht kann: den ersten Abnahmepunkt — die Messung am Produktivsystem. Den kannst nur du beisteuern (Netzwerk-Tab, einmal tippen, Dauer der Navigationsanfrage gegen die der
/api/image-Anfragen). Ich mache alles, was ohne diese Zahl belastbar ist, und lasse den Punkt offen.Zeiterfassung läuft.
✅ Umsetzung abgeschlossen — bereit zum Testen.
Was geändert wurde
SearchPending— eine schmale Klammer, die beide Suchen teilen: die Filterleiste meldet den Ladezustand, die Trefferliste daneben wird gedämpft und aufaria-busygesetzt/sucheGeänderte Dateien
src/components/SearchPending.tsx(neu)src/components/SearchField.tsxsrc/components/library/LibraryFilters.tsxsrc/app/suche/page.tsxsrc/app/bibliothek/page.tsxZwei Punkte der Abnahme sind nach Messung gegenstandslos
Facetten: an einer eigens angelegten Bibliothek mit 2000 Einträgen gemessen (Median aus 9 Läufen) —
getLibrary()50 ms,getLibraryFacets()17 ms, beide parallel 61 ms. Sie sind die schnellere Hälfte einesPromise.all; ein Wegfall spart 12 ms, eine Zwischenspeicherung brächte veraltete Zähler. Die Annahme „bei großer Bibliothek deutlich mehr" trifft nicht zu.Bilder: mit künstlich um 1500 ms verzögerten
/api/image-Antworten stehen die Treffer nach 465 ms im DOM — 891 ms vor den Bildern. Sie blockieren also nichts, und die Rückfallkacheln zeigen derweil die Titel. Ein Umbau des Endpunkts wäre Aufwand ohne Wirkung.Beides habe ich deshalb nicht angefasst.
Geprüft (Produktionsbau, Serverantwort künstlich gebremst)
aria-busyvorher/während/danach59 Tests grün, Typecheck sauber.
So testest du es
git switch fix/3-suche-rueckmeldungnpm run dev(Port 3011),/bibliotheköffnen und in das Suchfeld tippen/sucheOffen bleibt Abnahmepunkt 1 — die Messung am Produktivsystem. Die kann nur von dir kommen; siehe PR.
Aufgewendete Zeit: 00:07
Pull Request: #11
Nach Freigabe:
/issue-freigabe 3🚀 Freigegeben und nach
mainübernommen.58a1d17Vor dem Merge noch einmal geprüft: Typecheck sauber, 59 Tests grün.
Issue wird geschlossen. Der erste Abnahmepunkt — die Messung am Produktivsystem — bleibt damit unerledigt; die Erkenntnisse dazu stehen im PR, falls es doch noch klemmt.