分析工具链

工具链与大量外部工具和子库交互,具体集合通常取决于使用了哪些编译和链接器标志。如果您遇到非正常的编译时间,或者您正在开发 Emscripten 工具链本身,那么在编译项目时分析工具链本身的性能可能会有所帮助。Emscripten 具有一个内置的工具链范围 emprofile.py 分析器,可用于此目的。

快速示例

要试用工具链分析器,请运行以下命令集

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

在 Windows 上,将 export 关键字替换为 set。最后一个命令应该生成一个形式为 toolchain_profiler.results_yyyymmdd_hhmm.html 的 HTML 文件,可以在 Web 浏览器中打开以查看结果。

详情

只要工具链以环境变量 EMPROFILE=1 设置调用,工具链分析器就会处于活动状态。在这种模式下,每个调用的工具都会将分析仪器数据累积到 Emscripten 临时目录下的 .json 文件集中。

分析工具命令

命令 tools/emprofile.py --clear 删除所有先前存储的分析数据。调用此命令以将分析会话擦除到一个全新的空状态。要开始分析,请使用环境变量 EMPROFILE=1 调用 Emscripten 工具命令,无论是在系统范围内(如示例中所示)还是在每个命令的基础上,例如:

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

在一个会话中可以分析任意数量的命令,当最终调用 emprofile 时,它将拾取到那时为止的所有 Emscripten 工具调用的记录,对其进行绘图,并为下次运行清除已记录的分析数据。

输出 HTML 文件名可以使用可选的 --outfile=myresults.html 参数选择。

为 Python 脚本添加代码

Python 分析块

仅绘制子进程启动和结束时间有时可能对正在发生的事情的了解过于粗略。在 Python 代码中,可以使用分层注释单个代码块来将执行分解为自定义任务。这些块将在输出图中以蓝色显示。要添加自定义分析块,请使用 Python with 关键字添加一个 profile_block 部分

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

this_is_outside_the_block()

这将在同一范围内的三个函数下显示一个名为“my_custom_task”的块,在分析泳道中以蓝色绘制。

在某些情况下,将代码包装在 with 部分中可能很麻烦。对于这些情况,也可以使用低级 C 风格的 enter_blockexit_block 语句。

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

但是,使用此形式时,必须注意确保对 ToolchainProfiler.enter_block() 的每次调用都与对 ToolchainProfiler.exit_block() 的调用相匹配,在所有代码流中都是如此,因此将代码包装在 try-finally 语句中是一个好主意。