Signatur
Beschreibung
Der Konstruktor PerformanceMark() erzeugt einen benannten Zeitstempel vom Typ PerformanceMark (entryType ist "mark", duration ist immer 0). Den Zeitpunkt können Sie über startTime selbst festlegen, beliebige Zusatzdaten übergeben Sie über detail.
Der wichtigste Unterschied zu performance.mark(): Ein mit new PerformanceMark() erzeugtes Objekt wird nicht in die Performance-Zeitleiste eingetragen. Es taucht also weder in performance.getEntriesByType("mark") noch bei einem PerformanceObserver auf. Wenn die Markierung global sichtbar sein soll, etwa für DevTools, performance.measure() mit Mark-Namen oder RUM-Werkzeuge (Real User Monitoring), verwenden Sie performance.mark(). Diese Methode nimmt dieselben Argumente entgegen und gibt ebenfalls einen PerformanceMark zurück.
Der Konstruktor ist nützlich, wenn Sie Messpunkte nur lokal brauchen: zum Beispiel für eine eigene Messlogik, für Tests oder um Einträge zu sammeln und später gebündelt an einen Analyse-Server zu schicken. Er ist in Fenstern, in Web Workern und in Node.js (als globales PerformanceMark bzw. über perf_hooks) verfügbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Name der Markierung. Wird in entry.name gespeichert. Im Fenster-Kontext darf er nicht einem veralteten PerformanceTiming-Attribut entsprechen (z. B. "navigationStart"). |
|
| $markOptions | object | {} | Optionales Objekt mit Zusatzoptionen. |
| $markOptions.detail | any | null | Beliebige Zusatzdaten (Metadaten). Werden per structured clone kopiert und stehen danach in entry.detail. |
| $markOptions.startTime | DOMHighResTimeStamp (number) | performance.now() | Eigener Zeitstempel in Millisekunden relativ zu performance.timeOrigin. Darf nicht negativ sein. |
Beispiele
Einfache Markierung erzeugen
const mark = new PerformanceMark("app-start");
console.log(mark.name); // "app-start"
console.log(mark.entryType); // "mark"
console.log(mark.duration); // 0
console.log(typeof mark.startTime); // "number"
Eigener Zeitstempel und Zusatzdaten
const clickTime = performance.now();
const mark = new PerformanceMark("checkout-click", {
startTime: clickTime,
detail: { userId: 42, cartSize: 3 }
});
console.log(mark.startTime === clickTime); // true
console.log(mark.detail); // { userId: 42, cartSize: 3 }
Unterschied zu performance.mark(): kein Eintrag in der Zeitleiste
new PerformanceMark("lokal");
performance.mark("global");
const names = performance.getEntriesByType("mark").map((e) => e.name);
console.log(names.includes("lokal")); // false
console.log(names.includes("global")); // true
Lokale Messpunkte sammeln und gebündelt senden
const marks = [];
const track = (name, detail = null) => {
marks.push(new PerformanceMark(name, { detail }));
};
const loadData = async () => {
track("fetch-start");
const res = await fetch("/api/items");
const items = await res.json();
track("fetch-end", { count: items.length });
return items;
};
loadData().then(() => {
const [start, end] = marks;
console.log(`Ladezeit: ${(end.startTime - start.startTime).toFixed(1)} ms`);
navigator.sendBeacon("/metrics", JSON.stringify(marks.map((m) => m.toJSON())));
});
// Wichtig · Fallstricke
- Nicht in der Zeitleiste: Die Markierung wird nicht gepuffert.
performance.measure("x", "meinMark")findet sie deshalb nicht über ihren Namen. Übergeben Sie stattdessen{ start: mark.startTime }oder verwenden Sieperformance.mark(). - TypeError, wenn
startTimenegativ ist oder kein Name übergeben wurde. - SyntaxError im Fenster-Kontext, wenn
nameeinem Attribut vonPerformanceTimingentspricht (z. B."navigationStart"oder"loadEventEnd"). In Workern gilt diese Einschränkung nicht. detailwird per structured clone kopiert. Funktionen oder DOM-Knoten lösen einenDataCloneErroraus. Spätere Änderungen am Originalobjekt wirken sich nicht auf die Kopie aus.- Kompatibilität: Den Konstruktor und die Optionen
detail/startTimegibt es erst seit User Timing Level 3, in Firefox erst ab Version 101. Für ältere Umgebungen prüfen Sie mittypeof PerformanceMark === "function"und weichen notfalls aufperformance.mark()aus. - Die Zeitstempel können aus Datenschutzgründen (Schutz vor Timing-Angriffen) gerundet sein. Ohne Cross-Origin-Isolation ist die Auflösung deshalb geringer.