Erlang/OTP -定时应用

rwqw0loc  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(147)

我对程序的不同部分的速度进行基准测试很感兴趣。
我需要知道精确到微秒的平均速度是多少。我不知道为什么我写的脚本会有问题。
它应该能够在任何地方开始,在任何地方结束。当我试图在一个可能并行运行多达四次的进程上启动它时,我遇到了一个问题。
有没有人已经有了解决这个问题的办法?
编辑:
如果有人能提供一个脚本来做这件事,我愿意给一个赏金。它 * 需要 * 通过多个进程来繁殖。我不能接受像定时器这样的函数...至少在我所看到的实现中是这样。它只遍历一个进程,即使这样,一些主要的编辑对于一个完整的程序的完整测试是必要的。希望我说得足够清楚。

62lalag4

62lalag41#

下面介绍如何使用eprof,这可能是最简单的解决方案:
首先,您需要启动它,就像大多数应用程序一样:

23> eprof:start().
{ok,<0.95.0>}

Eprof支持两种分析模式。你可以调用它并要求分析某个函数,但我们不能使用它,因为其他进程会把一切搞砸。我们需要手动启动它的分析并告诉它何时停止(顺便说一句,这就是为什么你不会有一个简单的脚本)。

24> eprof:start_profiling([self()]).
profiling

这告诉eprof分析将从shell运行和产生的所有内容。新进程将包括在这里。我将运行我拥有的某个任意多处理函数,该函数将产生大约4个进程,它们相互通信几秒钟:

25> trade_calls:main_ab().
Spawned Carl: <0.99.0>
Spawned Jim: <0.101.0>
<0.100.0>
Jim: asking user <0.99.0> for a trade
Carl: <0.101.0> asked for a trade negotiation
Carl: accepting negotiation
Jim: starting negotiation
... <snip> ...

现在,我们可以告诉eprof在函数运行完毕后停止分析。

26> eprof:stop_profiling().
profiling_stopped

我们需要日志。默认情况下,Eprof会将它们打印到屏幕上。您可以要求它也将日志记录到一个带有eprof:log(File)的文件中。然后您可以告诉它分析结果。我们告诉它将所有进程的运行时间折叠到一个带有选项total的表中(更多选项请参见手册):

27> eprof:analyze(total).           
FUNCTION                                  CALLS      %  TIME  [uS / CALLS]
--------                                  -----    ---  ----  [----------]
io:o_request/3                               46   0.00     0  [      0.00]
io:columns/0                                  2   0.00     0  [      0.00]
io:columns/1                                  2   0.00     0  [      0.00]
io:format/1                                   4   0.00     0  [      0.00]
io:format/2                                  46   0.00     0  [      0.00]
io:request/2                                 48   0.00     0  [      0.00]
...
erlang:atom_to_list/1                         5   0.00     0  [      0.00]
io:format/3                                  46  16.67  1000  [     21.74]
erl_eval:bindings/1                           4  16.67  1000  [    250.00]
dict:store_bkt_val/3                        400  16.67  1000  [      2.50]
dict:store/3                                114  50.00  3000  [     26.32]

您可以看到,大部分时间(50%)都花在dict:store/3上。16.67%用于输出结果,另外16.67%用于erl_eval(这就是为什么在shell中运行短函数--解析它们比运行它们要长)。
然后,您可以从那里开始。这是使用Erlang分析运行时间的基础。请小心处理,eprof可能会给生产系统或运行时间过长的函数带来相当大的负担。尤其是在生产系统上。

bxjv4tth

bxjv4tth3#

通常的方法是使用timer:tc。Here是很好的解释。

igsr9ssn

igsr9ssn4#

我可以向您推荐此工具:https://github.com/virtan/eep
结果将得到类似于https://raw.github.com/virtan/eep/master/doc/sshot1.png的结果。
分析正在运行的系统上所有进程的分步说明:
在目标系统上:

1> eep:start_file_tracing("file_name"), timer:sleep(20000), eep:stop_tracing().
$ scp -C $PWD/file_name.trace desktop:

在桌面上:

1> eep:convert_tracing("file_name").
$ kcachegrind callgrind.out.file_name

相关问题