Profilierung von JavaScript-Code: Engpässe in der Praxis finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Profilierung ein Must-have für jeden Entwickler ist

Haben Sie jemals Code geschrieben, der zwar zu funktionieren scheint, aber in der Produktion anfängt zu „trödeln“? Oder haben Sie vielleicht einen Node.js-Server gestartet, der nach ein paar Minuten den gesamten Arbeitsspeicher verbraucht hat? Meistens liegt das Problem nicht an der Sprache, sondern an Engpässen – Codeabschnitten, die ineffizient ausgeführt werden.

Profilierung ist der Prozess der Sammlung von Metriken über die Programmausführung: Ausführungszeit von Funktionen, Speicherverbrauch, Aufrufhäufigkeit. Ohne sie ist jede Optimierung reine Kaffeesatzleserei. In diesem Artikel werden wir uns ansehen, wie man JavaScript-Code in der Node.js-Umgebung profiliert, „Flaschenhälse“ findet und beseitigt.

Sie erfahren mehr über die integrierten Tools von V8, Chrome DevTools und praktische Techniken, die Ihren Code schneller machen.



1. Integrierte Profilierung in Node.js: Das Flag --prof

Der einfachste Weg, mit der Profilierung zu beginnen, ist die Verwendung des Flags --prof beim Starten einer Node.js-Anwendung. Es aktiviert die Sammlung von V8-Statistiken, die dann in einen lesbaren Bericht umgewandelt werden.



Wie es funktioniert

Starten Sie Ihre Anwendung mit dem Flag:

node --prof app.js

Nach Beendigung der Anwendung erscheint im Ordner eine Datei namens isolate-0x...-v8.log. Dies sind Rohdaten. Um einen Bericht zu erhalten, verwenden Sie das Dienstprogramm node --prof-process:

node --prof-process isolate-0x...-v8.log > profile.txt


Beispiel: Eine langsame Funktion finden

Angenommen, wir haben diesen Code:

function slowSort(arr) {    return arr.sort((a, b) => a - b);}

function heavyComputation() { let sum = 0; for (let i = 0; i < 1e7; i++) { sum += Math.sqrt(i); } return sum;}

// Startconst data = Array.from({ length: 10000 }, () => Math.random());slowSort(data);heavyComputation();

Nach der Profilierung sehen Sie im Bericht etwa Folgendes:

[JavaScript]:   ticks  total  nonlib   name   120    60.0%  70.0%   LazyCompile: *heavyComputation app.js:5    40    20.0%  25.0%   LazyCompile: *slowSort app.js:1

Die Zahl ticks zeigt die Anzahl der „Ticks“ (Samples), die auf jede Funktion entfallen. Je mehr Ticks, desto länger wurde die Funktion ausgeführt. In unserem Fall ist heavyComputation der Hauptkandidat für eine Optimierung.



2. Chrome DevTools: Visueller Profiler für Node.js

Wenn der Textbericht unpraktisch erscheint, verwenden Sie Chrome DevTools. Dies ist eine grafische Oberfläche, die ein Flamegraph (Flammendiagramm) anzeigt – eine Visualisierung des Aufrufstapels über die Zeit.



Verbindung zu einem Node.js-Prozess herstellen

Starten Sie die Anwendung mit dem Flag --inspect:

node --inspect app.js

Öffnen Sie Chrome und geben Sie in der Adressleiste chrome://inspect ein. Klicken Sie auf „Open dedicated DevTools for Node“. Sie gelangen in eine Oberfläche, in der Sie Profile aufnehmen können.



Praktische Analyse

Betrachten wir ein Beispiel mit einem Speicherleck:

const cache = [];

function addToCache(item) { cache.push(item);}

function processData() { for (let i = 0; i < 100000; i++) { addToCache({ id: i, data: new Array(1000).fill('x') }); }}

processData();

Nehmen Sie ein Profil über den Tab „Memory“ auf (machen Sie einen Heap-Snapshot). Sie werden sehen, dass das Array cache Hunderte von Megabyte belegt. Das Flamegraph im Tab „Performance“ zeigt, dass die Funktion addToCache 100.000 Mal aufgerufen wird – das ist der Engpass.

Lösung: Entweder die Cache-Größe begrenzen oder eine Struktur mit automatischer Löschung alter Elemente verwenden (z. B. Map mit einem Limit).



3. Profilierung mit dem Modul perf_hooks

Für die punktgenaue Messung der Ausführungszeit bestimmter Codeabschnitte verwenden Sie das integrierte Modul perf_hooks. Dies ist ein Analogon zu

Blogs

Buchempfehlungen