Signatur
Beschreibung
console.profileEnd() beendet eine laufende Profiler-Aufzeichnung, die mit console.profile() gestartet wurde. Das fertige Profil erscheint danach im Performance- bzw. Profiler-Panel der Entwicklerwerkzeuge (Chrome: JavaScript Profiler/Performance, Firefox: Performance). Dort lassen sich Aufrufbaum, Selbstzeit und Gesamtzeit einzelner Funktionen auswerten.
Das Methodenpaar ist nützlich, wenn man genau einen Codeabschnitt messen will, statt die Aufzeichnung per Hand im Panel zu starten und zu stoppen. Das bietet sich etwa für eine teure Render-Funktion, einen Sortieralgorithmus oder einen einzelnen Event-Handler an. Der Code bestimmt selbst, wann die Messung beginnt und endet, und das macht Messungen wiederholbar.
Gibt man einen profileName an, wird genau das Profil mit diesem Namen beendet. Ohne Argument stoppt der Aufruf das zuletzt gestartete Profil. Profile können verschachtelt sein. Deshalb sollte man bei mehreren gleichzeitigen Aufzeichnungen immer Namen verwenden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $profileName | string | Name des zu beendenden Profils, wie er bei console.profile() angegeben wurde. Fehlt er, wird das zuletzt gestartete Profil beendet. |
Rückgabewert
undefined zurück. Das Ergebnis erscheint nur in den Entwicklerwerkzeugen, nicht als Rückgabewert.Beispiele
Teure Funktion gezielt profilen
const fibonacci = (n) => (n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2));
console.profile('fibonacci');
const result = fibonacci(30);
console.profileEnd('fibonacci');
console.log('Ergebnis:', result);
Verschachtelte Profile mit Namen beenden
const sortData = (arr) => [...arr].sort((a, b) => a - b);
const data = Array.from({ length: 200_000 }, () => Math.random());
console.profile('gesamt');
console.profile('sortieren');
const sorted = sortData(data);
console.profileEnd('sortieren');
const sum = sorted.reduce((acc, v) => acc + v, 0);
console.profileEnd('gesamt');
console.log(sorted.length, sum > 0);
Asynchronen Ablauf sicher mit try/finally messen
const loadUsers = async () => {
console.profile('loadUsers');
try {
const res = await fetch('https://jsonplaceholder.typicode.com/users');
const users = await res.json();
return users.map(({ name }) => name.toUpperCase());
} finally {
// Profil wird auch bei Fehlern sicher beendet
console.profileEnd('loadUsers');
}
};
loadUsers().then((names) => console.log(names.length));
// Wichtig · Fallstricke
- Nicht standardisiert:
console.profile()undconsole.profileEnd()stehen nicht im WHATWG-Console-Standard. Chromium-Browser, Firefox und Safari unterstützen sie, das Verhalten und die Darstellung unterscheiden sich aber. - Die Methoden wirken in der Regel nur bei geöffneten Entwicklerwerkzeugen. Ohne DevTools passiert meist nichts. In Node.js greifen sie nur, wenn ein Inspector verbunden ist (
node --inspect). - Ohne Namen beendet der Aufruf das zuletzt gestartete Profil. Bei verschachtelten oder gleichzeitig laufenden Messungen führt das leicht zu vertauschten Profilen. Deshalb besser immer Namen angeben.
- Wer vergisst,
profileEnd()aufzurufen (etwa weil vorher eine Ausnahme geworfen wird), lässt die Aufzeichnung weiterlaufen.try/finallyverhindert das. - Profiling kostet selbst Rechenzeit. Die gemessenen Zeiten sind daher nur Richtwerte. Die Aufrufe gehören nicht in Produktionscode.
- Für einfache Zeitmessungen ohne Aufrufbaum eignen sich
console.time()/console.timeEnd()oderperformance.mark()/performance.measure()besser, da sie breiter unterstützt werden.