查看源代码 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 运行时系统的负载。