查看源代码 eprof (tools v4.1.1)
Erlang 的时间分析工具
模块 eprof
提供了一组用于 Erlang 程序时间分析的函数,以找出执行时间的使用情况。分析使用 Erlang 跟踪 BIF 完成。当开始分析时,会启用对指定进程集的本地函数调用的跟踪,并在分析停止时禁用。
使用 Eprof 时,预计程序执行速度会减慢。
摘要
函数
如果 TypeOpts
是一个原子,则假定它是一个模块名称,并且此调用等效于 analyze(TypeOpts, [])
。
当分析停止后,调用此函数来显示结果。
调用此函数以确保 analyze/0,1,2
显示的结果将打印到文件 File
以及屏幕上。
如果 FunRootset
是一个 fun,则此调用等效于 profile([], FunRootset)
。
如果 Arg1
是一个 fun 且 Arg2
是一个列表,则此调用等效于 profile([], Arg1, {'_','_','_'}, Arg2)
。
此函数会生成一个进程,该进程应用一个 fun 或一个函数,然后开始对生成的进程以及 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
此函数生成一个进程 P
,该进程执行 apply(Module, Function, Args)
,然后开始对 P
和 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
启动 Eprof 服务器,该服务器保存收集到的数据的内部状态。
开始对 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
停止 Eprof 服务器。
停止使用 start_profiling/1
或 profile/1
开始的分析。
类型
函数
-spec analyze() -> ok | nothing_to_analyze.
等效于 analyze(procs, [])
。
-spec analyze(TypeOpts) -> ok | nothing_to_analyze when TypeOpts :: analyze_type().
如果 TypeOpts
是一个原子,则假定它是一个模块名称,并且此调用等效于 analyze(TypeOpts, [])
。
否则,如果 TypeOpts
是一个列表,则假定它是一个选项列表,并且此调用等效于 analyze(procs, TypeOpts)
。
-spec analyze(Type, Options) -> ok | nothing_to_analyze when Type :: analyze_type(), Options :: [Option], Option :: {filter, Filter} | {sort, Sort}, Filter :: [{calls, non_neg_integer()} | {time, float()}], Sort :: time | calls | mfa.
当分析停止后,调用此函数来显示结果。
如果 Type
为 procs
,则每个分析的进程中花费在每个函数中的时间将单独显示。
如果 Type
为 total
,则每个分析的进程中花费在每个函数中的时间将合并显示。
时间以总时间的百分比和微秒为单位的绝对时间显示。
-spec log(File) -> ok when File :: atom() | file:filename().
调用此函数以确保 analyze/0,1,2
显示的结果将打印到文件 File
以及屏幕上。
-spec profile(Fun) -> {ok, Value} | {error, Reason} when Fun :: fun(() -> term()), Value :: term(), Reason :: term(); (Rootset) -> profiling | {error, Reason} when Rootset :: [atom() | pid()], Reason :: term().
如果 FunRootset
是一个 fun,则此调用等效于 profile([], FunRootset)
。
如果 FunRootset
是一个列表,则假定它是一个 Rootset
,并且此调用等效于 start_profiling(Rootset)
。
-spec profile(Fun, Options) -> {ok, Value} | {error, Reason} when Fun :: fun(() -> term()), Options :: [set_on_spawn | {set_on_spawn, boolean()}], Value :: term(), Reason :: term(); (Rootset, Fun) -> {ok, Value} | {error, Reason} when Rootset :: [atom() | pid()], Fun :: fun(() -> term()), Value :: term(), Reason :: term().
如果 Arg1
是一个 fun 且 Arg2
是一个列表,则此调用等效于 profile([], Arg1, {'_','_','_'}, Arg2)
。
如果 Arg1
是一个列表且 Arg2
是一个 fun,则此调用等效于 profile(Arg1, Arg2, {'_','_','_'}, Arg1)
。
-spec profile(Rootset, Module, Function, Args) -> {ok, Value} | {error, Reason} when Rootset :: [atom() | pid()], Module :: module(), Function :: atom(), Args :: [term()], Value :: term(), Reason :: term(); (Rootset, Fun, Pattern, Options) -> {ok, Value} | {error, Reason} when Rootset :: [atom() | pid()], Fun :: fun(() -> term()), Pattern :: trace_pattern_mfa(), Options :: [set_on_spawn | {set_on_spawn, boolean()}], Value :: term(), Reason :: term().
此函数会生成一个进程,该进程应用一个 fun 或一个函数,然后开始对生成的进程以及 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
如果 Arg1
是一个 fun,则期望 Arg2
是一个跟踪模式,而 Arg3
是一个选项列表。在这种情况下,此调用等效于
profile(Rootset, erlang, apply, [Arg1, []], Arg2, Arg3)
如果 Arg1
是一个原子,则假定 Arg1
是一个模块名称,Arg2
是该模块中函数的名称,而 Arg3
是调用该函数时要使用的参数列表。在这种情况下,此调用等效于
profile(Rootset, Arg1, Arg2, Arg3, {'_','_','_'}, [{set_on_spawn, true}])
-spec profile(Rootset, Module, Function, Args, Pattern) -> {ok, Value} | {error, Reason} when Rootset :: [atom() | pid()], Module :: module(), Function :: atom(), Args :: [term()], Pattern :: trace_pattern_mfa(), Value :: term(), Reason :: term().
等效于 profile(Rootset, Module, Function, Args, Pattern, [{set_on_spawn, true}])
。
-spec profile(Rootset, Module, Function, Args, Pattern, Options) -> {ok, Value} | {error, Reason} when Rootset :: [atom() | pid()], Module :: module(), Function :: atom(), Args :: [term()], Pattern :: trace_pattern_mfa(), Options :: [set_on_spawn | {set_on_spawn, boolean()}], Value :: term(), Reason :: term().
此函数生成一个进程 P
,该进程执行 apply(Module, Function, Args)
,然后开始对 P
和 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
Rootset
是一个 pid 和注册名称的列表。
有关任何分析进程中的活动的信息都存储在 Eprof 数据库中。
如果可以为 P
和 Rootset
中的所有进程启用跟踪,则当 Fun()
/apply
返回值 Value
时,该函数返回 {ok,Value}
,或者如果 Fun()
/apply
因退出原因 Reason
而失败,则返回 {error,Reason}
。否则,它会立即返回 {error, Reason}
。
set_on_spawn
选项将激活对 rootset 中进程生成的所有进程的调用时间跟踪。这是默认行为。
程序员必须确保作为参数给出的函数是真正同步的,并且在函数返回值后没有工作继续进行。
-spec start() -> {ok, Pid} | {error, Reason} when Pid :: pid(), Reason :: {already_started, Pid}.
启动 Eprof 服务器,该服务器保存收集到的数据的内部状态。
-spec start_profiling(Rootset, Pattern) -> profiling | {error, Reason} when Rootset :: [atom() | pid()], Pattern :: trace_pattern_mfa(), Reason :: term().
-spec start_profiling(Rootset, Pattern, Options) -> profiling | {error, Reason} when Rootset :: [atom() | pid()], Pattern :: trace_pattern_mfa(), Options :: [set_on_spawn | {set_on_spawn, boolean()}], Reason :: term().
开始对 Rootset
中的进程(以及从它们生成的任何新进程)进行分析。
有关任何分析进程中的活动的信息都存储在 Eprof 数据库中。
Rootset
是一个 pid 和注册名称的列表。
如果可以为 Rootset
中的所有进程启用跟踪,则该函数返回 profiling
,否则返回 error
。
可以选择一种模式来缩小分析范围。例如,可以选择一个特定的模块,并且仅分析在该模块中执行的代码。
set_on_spawn
选项将激活对 rootset 中进程生成的所有进程的调用时间跟踪。这是默认行为。
-spec stop() -> stopped.
停止 Eprof 服务器。
-spec stop_profiling() -> profiling_stopped | profiling_already_stopped.
停止使用 start_profiling/1
或 profile/1
开始的分析。