Resource timing
Resource Timing ist Teil der Performance API und ermöglicht das Abrufen und Analysieren detaillierter Netzwerkzeitdaten für das Laden von Anwendungskomponenten. Eine Anwendung kann die Zeitmesswerte verwenden, um beispielsweise zu bestimmen, wie lange es dauert, eine bestimmte Ressource (wie ein Bild oder ein Skript) entweder implizit als Teil des Seitenladens oder explizit aus JavaScript zu laden, zum Beispiel unter Verwendung der fetch()
API.
Jede Ressource in einem Dokument wird durch einen PerformanceResourceTiming
Eintrag (der die PerformanceEntry
Schnittstelle erweitert) mit dem entryType
von "resource"
dargestellt.
Für jeden PerformanceResourceTiming
Eintrag wird eine Ressourcen-Ladezeitleiste mit hochauflösenden Zeitstempeln für Netzwerkereignisse wie Umleitungsstart- und -endzeiten, DNS-Lookup-Start- und -endzeiten, Anforderungsstart, Antwortstart- und -endzeiten, usw. erfasst. Neben den Zeitstempeln sind auch andere Eigenschaften enthalten, die Informationen über die Ressource bieten, wie die Größe der abgerufenen Ressource oder der Typ der Ressource, die den Abruf initiiert hat.
Ressourcenlade-Zeitstempel
Abbildung 1. Ressourcenlade-Zeitstempel (Quelle).
Eine Anwendung kann Zeitstempel für die verschiedenen Phasen abrufen, die zum Laden einer Ressource verwendet werden. Die Zeitstempel, die diese API bereitstellt, sind:
startTime
: Zeitstempel unmittelbar bevor der Ressourcenladeprozess beginnt.redirectStart
: Zeitstempel des Abrufs, der die Umleitung einleitet.redirectEnd
: Zeitstempel unmittelbar nach dem Empfang des letzten Bytes der Antwort auf die letzte Umleitung.workerStart
: Zeitstempel unmittelbar bevor der Service Worker-Thread gestartet wird.fetchStart
: Zeitstempel unmittelbar bevor der Browser beginnt, die Ressource abzurufen.domainLookupStart
: Zeitstempel unmittelbar bevor der Browser mit dem Domainnamen-Lookup für die Ressource beginnt.domainLookupEnd
: Zeitstempel unmittelbar nachdem der Browser den Domainnamen-Lookup für die Ressource abgeschlossen hat.connectStart
: Zeitstempel unmittelbar bevor der User-Agent beginnt, die Verbindung zum Server zur Abruf der Ressource herzustellen.secureConnectionStart
: Wenn die Ressource über eine sichere Verbindung geladen wird, Zeitstempel unmittelbar bevor der Browser den Handshake-Prozess startet, um die aktuelle Verbindung zu sichern.connectEnd
: Zeitstempel unmittelbar nachdem der Browser die Verbindung zum Server zur Abruf der Ressource hergestellt hat.requestStart
: Zeitstempel der Zeit unmittelbar bevor der Browser beginnt, die Ressource vom Server, Cache oder lokalen Ressource anzufordern.responseStart
: Zeitstempel unmittelbar nachdem der Browser das erste Byte der Antwort vom Server, Cache oder lokalen Ressource erhält.responseEnd
: Zeitstempel unmittelbar nachdem der Browser das letzte Byte der Ressource erhält oder unmittelbar bevor die Transportverbindung geschlossen wird, je nachdem, was zuerst eintritt.
Ressourcengröße
Die PerformanceResourceTiming
Schnittstelle verfügt über drei Eigenschaften, die zur Ermittlung von Größeninformationen einer Ressource verwendet werden können. Die transferSize
Eigenschaft gibt die Größe (in Bytes) der abgerufenen Ressource einschließlich der Antwortkopfzeilen und des Antwortnutzlastkörpers zurück.
Die encodedBodySize
Eigenschaft gibt die Größe (in Oktetten) der von der Anforderung (HTTP oder Cache) erhaltenen Nutzlastkörper vor dem Entfernen angewendeter Inhaltskodierungen zurück. decodedBodySize
gibt die Größe (in Oktetten) der von der Anforderung (HTTP oder Cache) erhaltenen Nachrichtenkörper nach dem Entfernen angewendeter Inhaltskodierungen zurück.
Andere Eigenschaften
Die PerformanceResourceTiming
Schnittstelle bietet zusätzliche Ressourceninformationen. Konsultieren Sie die Referenzdokumentation für die vollständige Liste der Eigenschaften.
Typische Ressourcentiming-Metriken
Die Informationen, die PerformanceResourceTiming
Einträge liefern, werden häufig für Berechnungen wie die folgenden verwendet:
- Messen der TCP-Handshake-Zeit (
connectEnd
-connectStart
) - Messen der DNS-Lookup-Zeit (
domainLookupEnd
-domainLookupStart
) - Messen der Umleitungszeit (
redirectEnd
-redirectStart
) - Messen der Anforderungszeit (
responseStart
-requestStart
) - Messen der TLS-Negotiationszeit (
requestStart
-secureConnectionStart
) - Messen der Abrufzeit (ohne Umleitungen) (
responseEnd
-fetchStart
) - Messen der ServiceWorker-Verarbeitungszeit (
fetchStart
-workerStart
) - Überprüfen, ob Inhalte komprimiert wurden (
decodedBodySize
sollte nichtencodedBodySize
sein) - Überprüfen, ob lokale Caches getroffen wurden (
transferSize
sollte0
sein) - Überprüfen, ob moderne und schnelle Protokolle verwendet werden (
nextHopProtocol
sollte HTTP/2 oder HTTP/3 sein) - Überprüfen, ob die richtigen Ressourcen render-blockierend sind (
renderBlockingStatus
)
Die PerformanceResourceTiming
Referenzseiten enthalten Beispielcode für die Messung all dieser Metriken. Typischerweise sieht der Code zur Messung dieser Metriken folgendermaßen aus:
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
const request = entry.responseStart - entry.requestStart;
if (request > 0) {
console.log(`${entry.name}: Request time: ${request}ms`);
}
});
});
observer.observe({ type: "resource", buffered: true });
Informationen zur Zeitmessung bei Fremdursprüngen
Wenn CORS wirksam ist, werden viele der Zeitmesswerte als Null zurückgegeben, es sei denn, die Zugriffspolitik des Servers erlaubt es, diese Werte zu teilen. Dies erfordert, dass der Server, der die Ressource bereitstellt, den Timing-Allow-Origin
HTTP-Antwortheader mit einem Wert sendet, der den Ursprung oder die Ursprünge spezifiziert, die die eingeschränkten Zeitstempelwerte erhalten dürfen.
Die Eigenschaften, die standardmäßig als 0 zurückgegeben werden, wenn eine Ressource von einem anderen Ursprung als der der Webseite selbst geladen wird: redirectStart
, redirectEnd
, domainLookupStart
, domainLookupEnd
, connectStart
, connectEnd
, secureConnectionStart
, requestStart
und responseStart
.
Um beispielsweise https://developer.mozilla.org
zu ermöglichen, auf Ressourcentiming-Informationen zuzugreifen, sollte die Cross-Origin-Ressource senden:
Timing-Allow-Origin: https://developer.mozilla.org
Verwaltung der Puffergrößen für Ressourcen
Falls Ihre Website oder Anwendung mehr als 250 Ressourcen abruft und Sie mehr als 250 PerformanceResourceTiming
Einträge aufzeichnen möchten, müssen Sie die Größe des Ressourcentiming-Puffers erhöhen.
Um die Größe des Leistungsressourcen-Datenpuffers des Browsers festzulegen, verwenden Sie die Methode Performance.setResourceTimingBufferSize()
, und um den Leistungsressourcen-Datenpuffer des Browsers zu leeren, verwenden Sie die Methode Performance.clearResourceTimings()
.
Um benachrichtigt zu werden, wenn der Ressourcenzeitmesspuffer des Browsers voll ist, hören Sie auf das resourcetimingbufferfull
Ereignis.
Der folgende Aufruf erlaubt 500 "resource"
-Leistungseinträge in der Performance-Timeline des Browsers.
performance.setResourceTimingBufferSize(500);
Weitere Informationen finden Sie auch unter Verwalten von Puffergrößen.