Profilierung der Toolchain

Die Toolchain interagiert mit einer moderaten Menge externer Tools und Unterbibliotheken, wobei der genaue Satz im Allgemeinen davon abhängt, welche Kompilierungs- und Linker-Flags verwendet wurden. Wenn Sie anormale Kompilierungszeiten feststellen oder wenn Sie die Emscripten-Toolchain selbst entwickeln, kann es nützlich sein, die Leistung der Toolchain selbst beim Kompilieren Ihres Projekts zu profilieren. Emscripten verfügt über einen integrierten Toolchain-weiten emprofile.py Profiler, der für diesen Zweck verwendet werden kann.

Kurzes Beispiel

Um den Toolchain-Profiler auszuprobieren, führen Sie die folgenden Befehle aus

cd path/to/emscripten
export EMPROFILE=1
emcc test/hello_world.c -O3 -o a.html
emprofile

Unter Windows ersetzen Sie das Schlüsselwort export durch set. Der letzte Befehl sollte eine HTML-Datei der Form toolchain_profiler.results_yyyymmdd_hhmm.html generieren, die im Webbrowser geöffnet werden kann, um die Ergebnisse anzuzeigen.

Details

Der Toolchain-Profiler ist aktiv, sobald die Toolchain mit der Umgebungsvariable EMPROFILE=1 aufgerufen wird. In diesem Modus sammelt jedes aufgerufene Tool Profiling-Instrumentierungsdaten in einer Reihe von .json-Dateien im temporären Emscripten-Verzeichnis.

Befehle zur Profilierung der Tools

Der Befehl tools/emprofile.py --clear löscht alle zuvor gespeicherten Profilierungsdaten. Rufen Sie diesen Befehl auf, um die Profilierungssitzung in einen frischen, leeren Zustand zurückzusetzen. Um die Profilierung zu starten, rufen Sie Emscripten-Tool-Befehle mit der Umgebungsvariable EMPROFILE=1 auf, die entweder systemweit wie im Beispiel gezeigt oder pro Befehl wie folgt gesetzt ist

emprofile --clear
EMPROFILE=1 emcc -c foo.c a.o
EMPROFILE=1 emcc a.o -O3 -o a.html
emprofile --outfile=myresults.html

Beliebig viele Befehle können innerhalb einer Sitzung profiliert werden, und wenn emprofile schließlich aufgerufen wird, werden die Aufzeichnungen aller Emscripten-Tool-Aufrufe bis zu diesem Zeitpunkt übernommen, grafisch dargestellt und die aufgezeichneten Profilierungsdaten für den nächsten Lauf gelöscht.

Der Name der Ausgabe-HTML-Datei kann mit dem optionalen Parameter --outfile=myresults.html gewählt werden.

Instrumentierung von Python-Skripten

Python-Profilierungsblöcke

Das alleinige grafische Darstellen der Start- und Endzeiten von Unterprozessen könnte manchmal eine etwas zu grobe Sicht auf das Geschehen sein. Im Python-Code ist es möglich, einzelne Codeblöcke hierarchisch zu annotieren, um die Ausführung in benutzerdefinierte Aufgaben zu unterteilen. Diese Blöcke werden im Ausgabediagramm blau dargestellt. Um einen benutzerdefinierten Profilierungsblock hinzuzufügen, verwenden Sie das Python-Schlüsselwort with, um einen profile_block-Abschnitt hinzuzufügen

with ToolchainProfiler.profile_block('my_custom_task'):
  do_some_tasks()
  call_another_function()
  more_code()

this_is_outside_the_block()

Dies zeigt die drei Funktionen im selben Bereich unter einem Block 'my_custom_task', der in der Profiling-Swimlane blau gezeichnet ist.

In einigen Fällen kann es umständlich sein, den Code in einen with-Abschnitt zu packen. Für diese Szenarien ist es auch möglich, Low-Level-Anweisungen im C-Stil enter_block und exit_block zu verwenden.

ToolchainProfiler.enter_block('my_code_block')
try:
  do_some_tasks()
  call_another_function()
  more_code()
finally:
  ToolchainProfiler.exit_block('my_code_block')

Bei dieser Form muss jedoch darauf geachtet werden, dass jeder Aufruf von ToolchainProfiler.enter_block() in allen Codeflüssen genau einem Aufruf von ToolchainProfiler.exit_block() entspricht, daher ist es eine gute Idee, den Code in eine try-finally-Anweisung zu packen.