Start · Sprachen · JavaScript · Referenz · PerformanceTiming

PerformanceTiming

Schnittstelle

Veraltete Schnittstelle mit Zeitstempeln (in ms seit Epoche) für die Phasen beim Laden einer Seite; erreichbar über <code>performance.timing</code>.

seit JavaScript Veraltet (Navigation Timing Level 1); weiterhin in deprecated seit ja Kategorie: webapi

Signatur

interface PerformanceTiming

Beschreibung

Die Schnittstelle PerformanceTiming stammt aus der Spezifikation Navigation Timing Level 1. Sie liefert Zeitstempel für die einzelnen Phasen beim Laden des aktuellen Dokuments: Umleitungen, DNS-Auflösung, TCP- und TLS-Verbindung, Anfrage und Antwort, DOM-Aufbau und das load-Ereignis. Eine Instanz erhält man ausschließlich über die schreibgeschützte Eigenschaft window.performance.timing. Selbst erzeugen kann man sie nicht.

Alle Eigenschaften sind vom Typ number (unsigned long long) und geben absolute Unix-Zeitstempel in Millisekunden an, gemessen seit dem 1. 1. 1970. Solange eine Phase noch nicht stattgefunden hat, ist der Wert 0. Die wichtigsten Eigenschaften in zeitlicher Reihenfolge:

  • navigationStart, unloadEventStart, unloadEventEnd
  • redirectStart, redirectEnd, fetchStart
  • domainLookupStart, domainLookupEnd, connectStart, secureConnectionStart, connectEnd
  • requestStart, responseStart, responseEnd
  • domLoading, domInteractive, domContentLoadedEventStart, domContentLoadedEventEnd, domComplete
  • loadEventStart, loadEventEnd

Außerdem gibt es die Methode toJSON(). Sie liefert ein einfaches Objekt mit allen Werten, das sich zum Beispiel für die Übertragung an einen Analyse-Server eignet.

Für neuen Code sollte man stattdessen PerformanceNavigationTiming verwenden (erreichbar über performance.getEntriesByType("navigation")). Diese Schnittstelle arbeitet mit hochauflösenden, relativen Zeitwerten (DOMHighResTimeStamp) und stellt zusätzliche Informationen bereit, etwa transferSize oder type.

Rückgabewert

Typ
PerformanceTiming
Beschreibung
Die Instanz ist über performance.timing erreichbar. Alle ihre Eigenschaften sind number-Werte in Millisekunden seit der Unix-Epoche oder 0, wenn die Phase noch nicht erreicht wurde.

Beispiele

Ladezeiten nach dem load-Ereignis berechnen

window.addEventListener('load', () => {
  // loadEventEnd wird erst nach Ende des load-Handlers gesetzt, daher verzögern
  setTimeout(() => {
    const t = performance.timing;
    const messwerte = {
      dns: t.domainLookupEnd - t.domainLookupStart,
      tcp: t.connectEnd - t.connectStart,
      ttfb: t.responseStart - t.requestStart,
      download: t.responseEnd - t.responseStart,
      domReady: t.domContentLoadedEventEnd - t.navigationStart,
      gesamt: t.loadEventEnd - t.navigationStart
    };
    console.table(messwerte);
  }, 0);
});
Tabelle mit Werten in ms, z. B. dns: 12, tcp: 35, ttfb: 120, download: 18, domReady: 640, gesamt: 1210

Alle Werte per toJSON() an einen Server senden

window.addEventListener('load', () => {
  setTimeout(() => {
    const daten = performance.timing.toJSON();
    navigator.sendBeacon('/analytics/timing', JSON.stringify(daten));
    console.log(Object.keys(daten).length, 'Messwerte gesendet');
  }, 0);
});
21 Messwerte gesendet

Moderne Alternative mit Rückgriff auf die alte API

const ladezeitErmitteln = () => {
  const [nav] = performance.getEntriesByType('navigation');
  if (nav) {
    // PerformanceNavigationTiming: Werte relativ zu startTime (0)
    return Math.round(nav.loadEventEnd);
  }
  // Rückgriff auf das veraltete PerformanceTiming
  const t = performance.timing;
  return t.loadEventEnd - t.navigationStart;
};

window.addEventListener('load', () => {
  setTimeout(() => console.log(`Ladezeit: ${ladezeitErmitteln()} ms`), 0);
});
Ladezeit: 1187 ms

// Wichtig · Fallstricke

Veraltet: PerformanceTiming und performance.timing sind in der Spezifikation als veraltet markiert. Die Browser unterstützen sie nur noch aus Gründen der Abwärtskompatibilität. Für neuen Code sollte man PerformanceNavigationTiming verwenden. In Web Workern steht die Schnittstelle nicht zur Verfügung.

  • Wert 0: Eigenschaften für Phasen, die noch nicht stattgefunden haben, sind 0. Wer direkt im load-Handler liest, bekommt für loadEventEnd noch 0 und damit einen negativen Differenzwert. Deshalb sollte man die Auswertung per setTimeout verzögern.
  • Auflösung: Die Werte sind ganze Millisekunden als absolute Zeitstempel und werden deshalb von Änderungen der Systemuhr beeinflusst. DOMHighResTimeStamp ist genauer und läuft gleichmäßig weiter (monoton).
  • Umleitungen und Unload: redirectStart/redirectEnd und unloadEventStart/unloadEventEnd bleiben 0, wenn die Umleitung oder die vorherige Seite von einem anderen Ursprung stammt.
  • secureConnectionStart ist bei HTTP-Verbindungen 0. Ältere Browser liefern hier undefined.
  • Datenschutz: Um Timing-Angriffe zu erschweren, können Browser die Genauigkeit der Zeitwerte absichtlich verringern.