查看源代码 fprof - 文件跟踪分析器

fprof 是一个分析工具,可用于了解不同函数消耗的以及在哪些进程中消耗的处理时间。

fprof 使用带时间戳的跟踪来收集分析数据。因此,无需对任何要分析的模块进行特殊编译。

fprof 提供来自主机操作系统的时间,并假设操作系统调度程序会以公平的方式随机加载被分析的函数。包括自身时间,即函数自身执行所用的时间;以及累计时间,即包括调用函数的执行时间。

分析基本上分 3 个步骤完成

  • 跟踪到文件。

  • 分析:读取跟踪文件,并将原始分析数据收集到节点上的内部 RAM 存储中。在此步骤中,跟踪数据可以文本格式转储到文件或控制台。

  • 分析:原始分析数据被排序,并以文本格式转储到文件或控制台。

由于 fprof 将跟踪数据存储到文件中,因此运行时性能下降已最小化,但仍然远非可以忽略不计,尤其是对于自身大量使用文件系统的程序。跟踪文件的位置也很重要;在 Unix 系统上,/tmp 通常是一个不错的选择,而任何网络安装的磁盘都是一个糟糕的选择。

fprof 也可以跳过文件步骤,直接跟踪到它自己的跟踪进程,该进程在运行时执行分析。

以下部分展示了一些如何使用 fprof 进行分析的示例。

从源代码进行分析

如果可以编辑和重新编译源代码,则可以在要分析的代码之前和之后插入 fprof:trace(start)fprof:trace(stop) 很方便。所有生成的进程也会被跟踪。如果想要使用非默认文件名,请使用 fprof:trace(start, "my_fprof.trace")

执行完成后,可以使用 fprof:profile() 处理原始分析数据,或使用 fprof:profile(file, "my_fprof.trace") 处理非默认文件名。

最后使用 fprof:analyse() 在控制台上转储一个信息丰富的表格,或使用 fprof:analyse(dest, []) 转储到文件,或使用 fprof:analyse([{dest, "my_fprof.analysis"}, {cols, 120}]) 来获得非默认文件名的更广泛列表。

分析一个函数

如果有一个函数执行您要分析的任务,并且该函数在分析应该停止时返回,则在跟踪步骤中使用 fprof:apply(Module, Function, Args) 很方便。

如果跟踪应在函数返回后继续进行,例如,如果它是生成要分析的进程的启动函数,请使用 fprof:apply(M, F, Args, [continue | OtherOpts])。必须在稍后的适当时间使用 fprof:trace(stop) 停止跟踪。

立即分析

也可以立即跟踪到创建原始分析数据的分析进程中,即缩短跟踪和分析步骤,以便不将文件系统用于跟踪。

执行类似以下的操作

{ok, Tracer} = fprof:profile(start),
fprof:trace([start, {tracer, Tracer}]),
%% Run code to profile
fprof:trace(stop);

这会减少文件系统的负载,但会增加 Erlang 运行时系统的负载。