Home
» 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.
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.
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.
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.
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.