Signatur
Beschreibung
performance.timeOrigin gibt einen DOMHighResTimeStamp zurück, also eine Gleitkommazahl in Millisekunden seit der Unix-Epoche (1. Januar 1970, UTC). Dieser Wert markiert den Zeitursprung des aktuellen Kontexts. Alle relativen Zeitstempel der Performance-API, etwa von performance.now() oder PerformanceEntry.startTime, werden ab diesem Zeitpunkt gemessen.
Wann der Zeitursprung liegt, hängt vom Kontext ab: In einem Fenster ist es in der Regel der Beginn der Navigation zum aktuellen Dokument. In einem dedizierten Worker ist es der Zeitpunkt, an dem der Worker erzeugt wurde, und in einem Service Worker der Start des Workers. In Node.js entspricht er dem Start des Prozesses.
Praktisch wird die Eigenschaft vor allem gebraucht, um relative Messwerte in absolute Zeitangaben umzurechnen (timeOrigin + now()). Das ist wichtig, wenn man Messungen aus verschiedenen Kontexten vergleichen will, zum Beispiel aus Hauptthread und Worker oder aus verschiedenen Tabs, oder wenn man Messdaten mit Server-Logs zusammenführt. Anders als Date.now() bleibt die Kombination aus timeOrigin und now() monoton. Nachträgliche Änderungen an der Systemuhr haben also keinen Einfluss.
Rückgabewert
Beispiele
Zeitursprung auslesen und als Datum anzeigen
const origin = performance.timeOrigin;
console.log(origin);
console.log(new Date(origin).toISOString());
Absoluten, hochauflösenden Zeitstempel erzeugen
// Relativer Wert + Ursprung = absolute Zeit (monoton, unabhängig von Uhränderungen)
const absoluteNow = () => performance.timeOrigin + performance.now();
const start = absoluteNow();
await new Promise((r) => setTimeout(r, 100));
console.log(`Dauer: ${(absoluteNow() - start).toFixed(1)} ms`);
console.log(`Abweichung zu Date.now(): ${(absoluteNow() - Date.now()).toFixed(1)} ms`);
Messwerte aus Worker und Hauptthread vergleichbar machen
// worker.js
self.postMessage({ t: performance.timeOrigin + performance.now() });
// main.js
const worker = new Worker('worker.js');
worker.addEventListener('message', ({ data }) => {
const mainNow = performance.timeOrigin + performance.now();
// Beide Werte liegen nun auf derselben absoluten Zeitachse
console.log(`Nachricht unterwegs: ${(mainNow - data.t).toFixed(2)} ms`);
});
PerformanceEntry mit Server-Log-Zeit korrelieren
const [nav] = performance.getEntriesByType('navigation');
const responseEndAbs = performance.timeOrigin + nav.responseEnd;
console.log('Antwort vollständig empfangen:', new Date(responseEndAbs).toISOString());
// z. B. an ein Analytics-Backend senden
navigator.sendBeacon('/rum', JSON.stringify({ responseEndAbs }));
// Wichtig · Fallstricke
- Genauigkeit gedrosselt: Zum Schutz vor Timing-Angriffen wie Spectre werden die Werte gerundet und mit Rauschen versehen. Je nach Browser ist die Auflösung gröber als 1 ms, zum Beispiel 100 µs oder schlechter. Nur in Kontexten mit Cross-Origin-Isolation (
COOP/COEP-Header, erkennbar ancrossOriginIsolated === true) steht eine höhere Auflösung zur Verfügung. - Keine exakte Wanduhr:
timeOriginwird einmal beim Start festgelegt. Wird danach die Systemuhr verstellt, weichttimeOrigin + now()vonDate.now()ab. Das ist gewollt, denn es geht um monotone Messwerte und nicht um eine synchronisierte Uhrzeit. - Bei Seiten, die lange im Hintergrund oder im Ruhezustand waren (auch nach dem Wiederherstellen aus dem bfcache), kann die Abweichung zur Systemzeit deutlich wachsen.
- Ältere Browser, etwa Safari vor Version 15, unterstützen die Eigenschaft nicht. Ein Ersatz ist
performance.timing.navigationStart, der inzwischen veraltet ist. Mit'timeOrigin' in performancelässt sich die Unterstützung prüfen. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird stillschweigend ignoriert und löst nur im Strict Mode einen
TypeErroraus.