Start · Sprachen · JavaScript · Referenz · PerformancePaintTiming.paintTime

PerformancePaintTiming.paintTime

Eigenschaft

Liefert als <code>DOMHighResTimeStamp</code> den Zeitpunkt, an dem die Renderphase endete und die Malphase (Paint) eines First Paint bzw. First Contentful Paint begann.

seit JavaScript Neu, noch nicht Baseline (zuerst in Chromium-basie Kategorie: webapi

Signatur

PerformancePaintTiming.paintTime

Beschreibung

Die schreibgeschützte Eigenschaft paintTime eines PerformancePaintTiming-Eintrags (Eintragstyp "paint") gibt an, wann der Browser im Schritt „Rendering aktualisieren“ die Arbeit am Hauptthread abgeschlossen und das Malen begonnen hat. Der Wert ist ein DOMHighResTimeStamp in Millisekunden, gemessen relativ zu performance.timeOrigin.

Wichtig ist der Unterschied zu presentationTime: paintTime markiert den Beginn der Malphase im Rendering-Prozess. presentationTime dagegen gibt an, wann die Pixel tatsächlich auf dem Bildschirm erscheinen. Dazwischen liegen Rasterisierung, Compositing und die Synchronisierung mit dem Bildschirm. startTime entspricht presentationTime, sofern der Browser diesen Wert liefert, ansonsten paintTime.

Nutzen Sie paintTime, wenn Sie Verzögerungen genauer eingrenzen möchten. Liegt paintTime früh, presentationTime aber spät, entsteht die Verzögerung im Compositor bzw. in der GPU-Pipeline und nicht im JavaScript- oder Layout-Code. Die Eigenschaft ist in allen Browsern gleich definiert (interoperabel). Deshalb eignet sie sich besser für Vergleiche zwischen Browsern als der implementierungsabhängige presentationTime-Wert.

Rückgabewert

Typ
DOMHighResTimeStamp
Beschreibung
Zeitstempel in Millisekunden (mit Nachkommastellen) relativ zu performance.timeOrigin, zu dem die Malphase begann.

Beispiele

First Contentful Paint mit PerformanceObserver auswerten

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(`${entry.name}: paintTime = ${entry.paintTime.toFixed(1)} ms`);
  }
});

// buffered: true liefert auch Einträge, die vor der Registrierung entstanden sind
observer.observe({ type: 'paint', buffered: true });
first-paint: paintTime = 312.4 ms first-contentful-paint: paintTime = 312.4 ms

Verzögerung zwischen Malbeginn und Anzeige ermitteln

new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (!('paintTime' in entry)) {
      console.log('paintTime wird nicht unterstützt, startTime:', entry.startTime);
      continue;
    }
    // presentationTime kann fehlen oder null sein (implementierungsabhängig)
    const shown = entry.presentationTime ?? entry.startTime;
    const delay = shown - entry.paintTime;
    console.log(`${entry.name}: Compositor/Anzeige-Verzögerung ${delay.toFixed(1)} ms`);
  }
}).observe({ type: 'paint', buffered: true });
first-contentful-paint: Compositor/Anzeige-Verzögerung 14.2 ms

Wert synchron auslesen und an Analytics senden

window.addEventListener('load', () => {
  const fcp = performance
    .getEntriesByName('first-contentful-paint', 'paint')[0];
  if (!fcp) return;

  const payload = JSON.stringify({
    metric: 'FCP',
    paintTime: Math.round(fcp.paintTime ?? fcp.startTime),
    startTime: Math.round(fcp.startTime),
  });
  navigator.sendBeacon('/analytics', payload);
  console.log(payload);
});
{"metric":"FCP","paintTime":312,"startTime":327}

// Wichtig · Fallstricke

  • Browser-Unterstützung: paintTime ist ein neuer Teil der Paint-Timing-Spezifikation (PaintTimingMixin) und zunächst nur in aktuellen Chromium-Browsern verfügbar. Prüfen Sie die Unterstützung mit 'paintTime' in entry und greifen Sie sonst auf startTime zurück.
  • Nicht mit startTime gleichsetzen: Liefert der Browser presentationTime, ist startTime meist später als paintTime. Für den Wert „Inhalt sichtbar“ (FCP im Sinne der Web Vitals) ist startTime die übliche Kennzahl.
  • Paint-Einträge gibt es nur für first-paint und first-contentful-paint, jeweils einmal pro Dokument. Wird die Seite im Hintergrund-Tab geladen, entstehen sie möglicherweise gar nicht oder erst verspätet.
  • Aus Datenschutzgründen (Timing-Angriffe) können die Zeitstempel je nach Browser und Cross-Origin-Isolation vergröbert sein.
  • Dieselbe Eigenschaft gibt es auch bei LargestContentfulPaint, dort mit identischer Bedeutung.