查看源代码 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),然后开始对 PRootset 中的进程(以及从它们生成的任何新进程)进行分析。

启动 Eprof 服务器,该服务器保存收集到的数据的内部状态。

开始对 Rootset 中的进程(以及从它们生成的任何新进程)进行分析。

停止 Eprof 服务器。

停止使用 start_profiling/1profile/1 开始的分析。

类型

此类型的链接

analyze_type()

查看源代码 (未导出)
-type analyze_type() :: procs | total.
此类型的链接

trace_pattern_mfa()

查看源代码 (未导出)
-type trace_pattern_mfa() :: {atom(), atom(), arity() | '_'}.

函数

此函数的链接

analyze()

查看源代码 (自 OTP R14B 起)
-spec analyze() -> ok | nothing_to_analyze.

等效于 analyze(procs, [])

此函数的链接

analyze(TypeOpts)

查看源代码 (自 OTP R14B 起)
-spec analyze(TypeOpts) -> ok | nothing_to_analyze when TypeOpts :: analyze_type().

如果 TypeOpts 是一个原子,则假定它是一个模块名称,并且此调用等效于 analyze(TypeOpts, [])

否则,如果 TypeOpts 是一个列表,则假定它是一个选项列表,并且此调用等效于 analyze(procs, TypeOpts)

此函数的链接

analyze(Type, Options)

查看源代码 (自 OTP R14B 起)
-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.

当分析停止后,调用此函数来显示结果。

如果 Typeprocs,则每个分析的进程中花费在每个函数中的时间将单独显示。

如果 Typetotal,则每个分析的进程中花费在每个函数中的时间将合并显示。

时间以总时间的百分比和微秒为单位的绝对时间显示。

-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)

此函数的链接

profile(Rootset, Fun, Pattern)

查看源代码 (自 OTP R14B 起)
-spec profile(Rootset, Fun, Pattern) -> {ok, Value} | {error, Reason}
                 when
                     Rootset :: [atom() | pid()],
                     Fun :: fun(() -> term()),
                     Pattern :: trace_pattern_mfa(),
                     Value :: term(),
                     Reason :: term().

等效于 profile(Rootset, Fun, Pattern, [{set_on_spawn, true}])

此函数的链接

profile(Rootset, Arg1, Arg2, Arg3)

查看源代码
-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}])

此函数的链接

profile(Rootset, Module, Function, Args, Pattern)

查看源代码 (自 OTP R14B 起)
-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}])

此函数的链接

profile(Rootset, Module, Function, Args, Pattern, Options)

查看源代码 (自 OTP R16B01 起)
-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),然后开始对 PRootset 中的进程(以及从它们生成的任何新进程)进行分析。

Rootset 是一个 pid 和注册名称的列表。

有关任何分析进程中的活动的信息都存储在 Eprof 数据库中。

如果可以为 PRootset 中的所有进程启用跟踪,则当 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 服务器,该服务器保存收集到的数据的内部状态。

此函数的链接

start_profiling(Rootset)

查看源代码
-spec start_profiling(Rootset) -> profiling | {error, Reason}
                         when Rootset :: [atom() | pid()], Reason :: term().

等效于 start_profiling(Rootset, {'_', '_', '_'})

此函数的链接

start_profiling(Rootset, Pattern)

查看源代码 (自 OTP R14B 起)
-spec start_profiling(Rootset, Pattern) -> profiling | {error, Reason}
                         when
                             Rootset :: [atom() | pid()],
                             Pattern :: trace_pattern_mfa(),
                             Reason :: term().

等效于 start_profiling(Rootset, Pattern, {'_', '_', '_'})

此函数的链接

start_profiling(Rootset, Pattern, Options)

查看源代码 (自 OTP R16B01 起)
-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/1profile/1 开始的分析。