Signatur
Beschreibung
duration ist eine schreibgeschützte Eigenschaft jedes PerformanceEntry. Sie liefert einen DOMHighResTimeStamp, also eine Gleitkommazahl in Millisekunden mit Bruchteilen. Zusammen mit startTime beschreibt sie das Zeitfenster eines Eintrags: Das Ende liegt bei startTime + duration.
Was die Dauer genau bedeutet, hängt vom entryType ab:
measure: Zeit zwischen Start- und Endmarke vonperformance.measure().resource:responseEnd - startTime, also die gesamte Ladezeit einer Ressource.navigation:loadEventEnd - startTime. Der Wert bleibt0, bis dasload-Ereignis abgeschlossen ist.longtask/long-animation-frame: Laufzeit der langen Aufgabe bzw. des Frames (ab 50 ms).event/first-input: Zeit vonstartTimebis zum nächsten Rendern nach der Verarbeitung, auf 8 ms gerundet.mark,paint,largest-contentful-paint,layout-shift,element,visibility-state: immer0, weil diese Einträge einen Zeitpunkt beschreiben und keinen Zeitraum.
Sie nutzen duration vor allem, um eigenen Code zu messen (User Timing), langsame Netzwerkanfragen zu finden (Resource Timing), die Ladezeit der Seite auszuwerten (Navigation Timing) und lange Aufgaben auf dem Hauptthread zu erkennen. So kommen Sie zu Daten für Real-User-Monitoring.
Rückgabewert
mark, paint), ist der Wert 0.Beispiele
Eigenen Code mit performance.measure() messen
performance.mark('sortieren-start');
const daten = Array.from({ length: 200_000 }, () => Math.random());
daten.sort((a, b) => a - b);
performance.mark('sortieren-ende');
const messung = performance.measure('sortieren', 'sortieren-start', 'sortieren-ende');
console.log(`${messung.name}: ${messung.duration.toFixed(2)} ms`);
Langsame Ressourcen mit PerformanceObserver finden
const SCHWELLE_MS = 500;
const observer = new PerformanceObserver((liste) => {
for (const eintrag of liste.getEntries()) {
if (eintrag.duration > SCHWELLE_MS) {
console.warn(`Langsam: ${eintrag.name} (${Math.round(eintrag.duration)} ms)`);
}
}
});
// buffered: true liefert auch Einträge, die schon vorher entstanden sind
observer.observe({ type: 'resource', buffered: true });
Gesamte Ladezeit der Seite auswerten
window.addEventListener('load', () => {
// Einen Tick warten, damit loadEventEnd gesetzt ist
setTimeout(() => {
const [nav] = performance.getEntriesByType('navigation');
console.log(`Seitenladezeit: ${Math.round(nav.duration)} ms`);
}, 0);
});
Lange Aufgaben auf dem Hauptthread erkennen
new PerformanceObserver((liste) => {
liste.getEntries().forEach((task) => {
console.log(`Long Task: ${task.duration} ms ab ${task.startTime.toFixed(0)} ms`);
});
}).observe({ type: 'longtask', buffered: true });
// Wichtig · Fallstricke
- Der Wert
0ist kein Fehler: Beimark,paint,largest-contentful-paint,layout-shiftund ähnlichen Einträgen istdurationimmer0. Beinavigationbleibt der Wert0, bis dasload-Ereignis vollständig abgeschlossen ist. Lesen Sie ihn also erst danach aus, am besten in einemsetTimeout. - Reduzierte Genauigkeit: Zum Schutz vor Timing-Angriffen (Spectre) runden Browser Zeitstempel ab. Ohne Cross-Origin-Isolation (COOP/COEP) liegt die Genauigkeit meist bei etwa 100 µs, in Firefox oft bei 1 ms. Bei
event-Einträgen wird zusätzlich auf 8 ms gerundet. - Cross-Origin-Ressourcen: Für Ressourcen von fremden Ursprüngen ohne Header
Timing-Allow-Originistdurationzwar vorhanden, viele Detailwerte (z. B.requestStart) sind aber0. Aus Cache geladene Ressourcen haben oft eine sehr kurze Dauer. - Puffergrenze: Der Resource-Timing-Puffer fasst standardmäßig 250 Einträge. Mit
performance.setResourceTimingBufferSize()können Sie ihn vergrößern, oder Sie verwenden einenPerformanceObserver. - Kompatibilität: Die Eigenschaft selbst funktioniert in allen modernen Browsern. Einzelne Eintragstypen wie
longtask,long-animation-frameundeventgibt es derzeit aber vor allem in Chromium-Browsern. Prüfen Sie die Unterstützung mitPerformanceObserver.supportedEntryTypes.