2.6 KiB
Performanceaudit 2026-07-29
Importoptimalisatie 0.3.14
De eerder geregistreerde importhotspot is opgelost en reproduceerbaar gemeten in een disposable PostgreSQL-database. Tegenover de 0.3.13-baseline daalt de gemiddelde 250-itemimport van 16.358,158 naar 9.040,123 ms; p95 daalt van 79,871 naar 52,296 ms en queryvolume van meer dan 9.000 naar exact 3.264. Zie IMPORT_PERFORMANCE_BASELINE.md, IMPORT_QUERY_ANALYSIS.md en IMPORT_PERFORMANCE_FINAL.md.
Baseline
- Lokale quickbenchmark: 250 invoeritems op Windows 11, Python 3.13, 16 CPU-threads.
- Import: p50 348,879 ms; p95 825,107 ms; totaal 125.982,74 ms.
- Dashboardlijst: p95 1.128,986 ms in de synthetische benchmark.
- Detail: p95 101,754 ms.
- Rescore: 53,284 ms voor de overgebleven unieke job in deze quickrun.
- Piekgeheugen: 105,588 MB.
- Frontend: lokale CSS en JavaScript, zonder framework of externe runtimeassets.
De eerste run ontdekte een echte benchmarkfout: de generieke HTML-fixture leverde slechts vier van zes verwachte velden. De adapter en fixture ondersteunen nu ook gelabelde publicatiedatum en dienstverband. De herhaalde kwaliteitsrun behaalt 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en nul rankingchurn.
Wijzigingen
- Vacaturepaginering verlaagd van 30 naar 20 kaarten per pagina.
- Ultrawideframe gecentreerd zonder extra clientcode.
- Mobiele pipeline gebruikt een verticale grid en veroorzaakt geen horizontale documentoverflow.
- Runtimeheartbeat gebruikt de bestaande cache en voegt geen netwerkprobe aan paginarendering toe.
Resterende risico's
- De synthetische quickimport overschrijdt de historische NFR-007-p95-doelwaarde; profiling van het volledige 25.000-itempad blijft zinvol vóór opschaling.
- De quickbenchmark meldt meer dan 7.900 databasequeries voor 250 importpogingen. Correctheid en idempotentie zijn goed, maar bulkimport is de eerstvolgende optimalisatiekandidaat.
- Queuediepte is met de generieke Django-cachebackend niet betrouwbaar meetbaar en wordt daarom eerlijk als onbekend getoond.
Productiereleaseprofiling
De releaseherhaling overschreed opnieuw Django's queryloglimiet van 9.000 queries voordat de 250-itemrun afrondde. Een aansluitende herhaalrun produceerde door achtergebleven benchmarkidentiteiten geen nieuwe vacatures; database-isolatie via de lokale .env activeerde vervolgens terecht de productiedriver. Daardoor is geen betrouwbare nawaarde beschikbaar en is geen risicovolle pipelinebulkrefactor in de productieoplevering opgenomen. Vervolg: geef de benchmark een expliciete tijdelijke database en profileer process_extraction_batch per queryfamilie; behoud idempotentie, dedupeprecision/recall 1,0 en nul rankingchurn.