Start · Sprachen · JavaScript · Referenz · PerformanceScriptTiming.pauseDuration

PerformanceScriptTiming.pauseDuration

Eigenschaft

Gibt die Gesamtzeit in Millisekunden an, die ein Skript in synchronen, blockierenden „Pausen“ wie <code>alert()</code> oder synchronem XHR verbracht hat.

seit JavaScript Chromium 123+ (Long Animation Frames API, experime Kategorie: webapi

Signatur

get PerformanceScriptTiming.pauseDuration

Beschreibung

Die schreibgeschützte Eigenschaft pauseDuration eines PerformanceScriptTiming-Eintrags liefert einen DOMHighResTimeStamp. Er gibt an, wie viele Millisekunden ein Skript insgesamt mit synchronen, den Hauptthread anhaltenden Operationen verbracht hat. Typische Auslöser sind window.alert(), window.confirm(), window.prompt() und synchrone XMLHttpRequest-Aufrufe.

PerformanceScriptTiming-Einträge gehören zur Long Animation Frames API (LoAF). Man erhält sie nicht direkt über einen eigenen Eintragstyp, sondern über die Eigenschaft scripts eines PerformanceLongAnimationFrameTiming-Eintrags. Diese Einträge beobachtet man mit einem PerformanceObserver vom Typ "long-animation-frame".

Der Wert zeigt, ob ein langsamer Frame von echter Rechenarbeit kommt oder davon, dass ein Skript auf eine blockierende Nutzerinteraktion bzw. Netzwerkantwort gewartet hat. Zieht man pauseDuration (und forcedStyleAndLayoutDuration) von der duration des Skripts ab, bleibt ungefähr die reine Ausführungszeit übrig.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Summe aller synchronen Pausen des Skripts in Millisekunden. Gibt es keine Pausen, ist der Wert 0.

Beispiele

Pausenzeit aller Skripte in langen Frames protokollieren

const observer = new PerformanceObserver((list) => {
  for (const frame of list.getEntries()) {
    for (const script of frame.scripts) {
      if (script.pauseDuration > 0) {
        console.log(
          `${script.sourceURL || script.invoker}: ${script.pauseDuration.toFixed(1)} ms pausiert`
        );
      }
    }
  }
});

observer.observe({ type: 'long-animation-frame', buffered: true });

// Löst eine blockierende Pause aus
button.addEventListener('click', () => alert('Gespeichert!'));
https://example.com/app.js: 1834.2 ms pausiert

Reine Ausführungszeit ohne Pausen berechnen

const analyse = (script) => {
  const netto = script.duration
    - script.pauseDuration
    - script.forcedStyleAndLayoutDuration;
  return {
    quelle: script.sourceFunctionName || script.invoker,
    gesamt: Math.round(script.duration),
    pause: Math.round(script.pauseDuration),
    netto: Math.round(netto)
  };
};

new PerformanceObserver((list) => {
  const daten = list.getEntries().flatMap((f) => f.scripts.map(analyse));
  console.table(daten);
}).observe({ type: 'long-animation-frame', buffered: true });
┌─────────┬──────────────┬────────┬───────┬───────┐ │ (index) │ quelle │ gesamt │ pause │ netto │ │ 0 │ 'saveForm' │ 2140 │ 2010 │ 118 │ └─────────┴──────────────┴────────┴───────┴───────┘

Pausen per Feature-Erkennung an ein RUM-Backend melden

if (PerformanceObserver.supportedEntryTypes?.includes('long-animation-frame')) {
  new PerformanceObserver((list) => {
    const pausen = list.getEntries()
      .flatMap((f) => f.scripts)
      .filter((s) => s.pauseDuration > 50)
      .map((s) => ({ url: s.sourceURL, pauseMs: Math.round(s.pauseDuration) }));

    if (pausen.length) {
      navigator.sendBeacon('/rum/pausen', JSON.stringify(pausen));
    }
  }).observe({ type: 'long-animation-frame', buffered: true });
} else {
  console.info('Long Animation Frames API wird nicht unterstützt.');
}

// Wichtig · Fallstricke

  • Kompatibilität: Die Long Animation Frames API gibt es bisher nur in Chromium-basierten Browsern (Chrome/Edge ab 123). Firefox und Safari unterstützen sie nicht. Prüfe die Unterstützung vorab mit PerformanceObserver.supportedEntryTypes.
  • Skripte erscheinen nur in scripts, wenn der Frame als „lang“ gilt (über 50 ms) und das einzelne Skript mindestens etwa 5 ms gedauert hat. Kurze Pausen tauchen deshalb oft gar nicht auf.
  • Ein hoher Wert deutet meist auf alert()/confirm()/prompt() oder synchrones XHR hin. Die Wartezeit hängt davon ab, wie schnell Nutzer reagieren, und sagt wenig über die Leistung des Codes selbst aus. Besser sind nicht-blockierende Dialoge (<dialog>) und asynchrones fetch().
  • Bei Cross-Origin-Skripten ohne passende CORS-Freigabe können Angaben wie sourceURL eingeschränkt sein. Das kann die Zuordnung der Pausenzeit erschweren.