Erlang/OTP-定时应用程序

Erlang/OTP-定时应用程序,erlang,performance,timing,Erlang,Performance,Timing,我对我的速度计划的不同部分进行基准测试感兴趣。我尝试过使用info(statistics)和erlang:now() 我需要知道到微秒的平均速度是多少。我不知道为什么我写的剧本有问题 它应该能够从任何地方开始,在任何地方结束。当我尝试在一个可能并行运行四次的进程上启动它时,我遇到了一个问题 有没有人已经找到了这个问题的解决方案 编辑: 如果有人能提供剧本,愿意提供赏金。它需要通过“多进程”生成。我不能接受计时器这样的功能。。至少在我看到的实现中。它只遍历一个进程,即使是这样,对完整程序进行完整测

我对我的速度计划的不同部分进行基准测试感兴趣。我尝试过使用
info(statistics)
erlang:now()

我需要知道到微秒的平均速度是多少。我不知道为什么我写的剧本有问题

它应该能够从任何地方开始,在任何地方结束。当我尝试在一个可能并行运行四次的进程上启动它时,我遇到了一个问题

有没有人已经找到了这个问题的解决方案

编辑:


如果有人能提供剧本,愿意提供赏金。它需要通过“多进程”生成。我不能接受计时器这样的功能。。至少在我看到的实现中。它只遍历一个进程,即使是这样,对完整程序进行完整测试也需要进行一些主要的编辑。希望我说得够清楚。

正常的方法是使用定时器:tc。这是一个很好的解释。

您可以使用。

以下是如何使用eprof,这可能是最简单的解决方案:

首先,您需要启动它,就像大多数应用程序一样:

23> eprof:start().
{ok,<0.95.0>}
这告诉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会将它们打印到屏幕上。您可以要求它也使用
eprof:log(file)
登录到一个文件。然后你可以告诉它分析结果。我们告诉它使用选项
total
(有关更多选项,请参阅)将所有进程的运行时折叠到一个表中:

您可以看到,大部分时间(50%)都花在dict:store/3上。16.67%用于输出结果,另外16.67%用于erl_eval(这就是为什么在shell中运行短函数——解析它们比运行它们要长)


然后你可以从那里开始。这是使用Erlang分析运行时的基础。小心处理,eprof可能对生产系统或运行时间过长的功能造成相当大的负载。尤其是在生产系统上。

我可以向您推荐以下工具:

你会得到这样的结果

用于评测运行系统上所有进程的分步说明:

在目标系统上:

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

我需要它在整个过程中运行,而不仅仅是测试一个。这里有几个问题:这是一个生产系统吗
eprof
尤其是
fprof
在运行时会导致性能下降。两者都可以遵循新产生的过程。不过,您可能还需要测量一些其他因素,如网络往返等等!最简单的方法可能是在要测量的函数周围插入
timer:tc
调用。或者,使用
erlang:now()
并将其发送到另一个进程,然后该进程可以进行测量工作。您的eprof脚本(或演练)位于页面下方:)很好的工作人员,尝试过,看起来很不错。。一个问题:为什么一些进程在我的程序中说0次调用?我知道它必须被调用才能有其他的功能,比如列表:扁平化。这是显而易见的吗?或者对我的程序来说更深奥一点。我不能说没有代码——我不记得在我自己的代码中看到过它。
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]
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