Signatur
Beschreibung
Der Konstruktor Profiler() gehört zur JS Self-Profiling API. Mit ihr kann eine Webanwendung ihre eigene JavaScript-Ausführung im Browser echter Nutzer messen, statt nur lokal in den DevTools. Sobald das Objekt erzeugt ist, beginnt der Browser, in regelmäßigen Abständen den aktuellen Aufrufstapel aufzuzeichnen. Einen eigenen start()-Aufruf gibt es nicht.
Beendet wird die Aufzeichnung mit profiler.stop(). Die Methode gibt ein Promise zurück, das mit einem ProfilerTrace-Objekt erfüllt wird. Es enthält die Felder resources (Skript-URLs), frames (Funktionsname, Zeile, Spalte), stacks (verkettete Stapelrahmen) und samples (Zeitstempel mit Verweis auf einen Stapel). Diese Daten schickt man meist an einen eigenen Server und wertet sie dort aus, etwa um langsame Funktionen bei der Interaktion echter Nutzer zu finden.
Die API funktioniert nur, wenn das Dokument mit dem HTTP-Antwortkopf Document-Policy: js-profiling ausgeliefert wurde. Fehlt dieser Kopf, wirft der Konstruktor einen Fehler. Das tatsächlich genutzte Abtastintervall kann vom gewünschten abweichen. Es lässt sich über profiler.sampleInterval auslesen. Ist der Puffer voll, löst der Profiler das Ereignis samplebufferfull aus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options Pflicht | Object | Konfigurationsobjekt (ProfilerInitOptions) mit den folgenden Pflichtfeldern. |
|
| $options.sampleInterval Pflicht | number | Gewünschter Abstand zwischen zwei Stichproben in Millisekunden (DOMHighResTimeStamp). Der Browser darf auf ein unterstütztes Intervall runden, in Chromium derzeit meist 10 ms (unter Windows 16 ms). Negative Werte führen zu einem RangeError. |
|
| $options.maxBufferSize Pflicht | number | Höchstzahl der Stichproben, die gespeichert werden. Wird sie erreicht, endet die Aufzeichnung und das Ereignis samplebufferfull wird ausgelöst. |
Rückgabewert
Profiler-Objekt (erbt von EventTarget), das sofort aufzeichnet. Es hat die Eigenschaften sampleInterval und stopped sowie die Methode stop().Beispiele
Einen Codeabschnitt profilieren
// Voraussetzung: Server sendet 'Document-Policy: js-profiling'
const profiler = new Profiler({ sampleInterval: 10, maxBufferSize: 10_000 });
// Rechenintensive Arbeit
const fib = (n) => (n < 2 ? n : fib(n - 1) + fib(n - 2));
fib(30);
const trace = await profiler.stop();
console.log('Intervall:', profiler.sampleInterval, 'ms');
console.log('Stichproben:', trace.samples.length);
console.log('Frames:', trace.frames.map((f) => f.name));
Feature-Erkennung und Fehlerbehandlung
const startProfiler = () => {
if (!('Profiler' in globalThis)) {
console.warn('JS Self-Profiling wird nicht unterstützt');
return null;
}
try {
return new Profiler({ sampleInterval: 10, maxBufferSize: 5000 });
} catch (err) {
// z. B. NotAllowedError, wenn der Document-Policy-Header fehlt
console.warn('Profiler nicht erlaubt:', err.name);
return null;
}
};
const profiler = startProfiler();
Eine Nutzerinteraktion profilieren und Trace hochladen
const button = document.querySelector('#export');
button.addEventListener('click', async () => {
const profiler = new Profiler({ sampleInterval: 10, maxBufferSize: 2000 });
profiler.addEventListener('samplebufferfull', () => {
console.warn('Puffer voll – Aufzeichnung beendet');
});
await exportData(); // eigene Anwendungsfunktion
const trace = await profiler.stop();
navigator.sendBeacon('/api/profiles', JSON.stringify(trace));
});
// Wichtig · Fallstricke
- Experimentell: Die API ist nur in Chromium-Browsern (ab Version 94) verfügbar. Firefox und Safari unterstützen sie nicht. Vorher immer mit
'Profiler' in globalThisprüfen. - Document Policy nötig: Ohne den Antwortkopf
Document-Policy: js-profilingwirft der Konstruktor einenDOMExceptionvom TypNotAllowedError. - Beide Optionen sind Pflicht. Fehlt eine, wird ein
TypeErrorgeworfen. Ein negativessampleIntervalführt zu einemRangeError. - Das gewünschte Intervall wird nicht garantiert. Den tatsächlichen Wert liefert
profiler.sampleInterval. - Leistung: Das Profiling kostet selbst Rechenzeit. Deshalb besser nur bei einem kleinen Teil der Nutzer aktivieren (Sampling) und
maxBufferSizeknapp wählen. - Datenschutz/Sicherheit: Frames aus Cross-Origin-Skripten erscheinen nur, wenn diese per CORS geladen werden (
crossorigin-Attribut plus passenderAccess-Control-Allow-Origin-Kopf). Traces können Funktionsnamen und URLs enthalten und sollten deshalb vertraulich behandelt werden. - Nach
stop()kann ein Profiler nicht erneut gestartet werden. Für eine neue Messung ist eine neue Instanz nötig.