ERLANG - 计时应用

时间:2010-12-01 22:41:47

标签: erlang performance timing

我有兴趣对程序的不同部分进行基准测试以提高速度。我尝试过使用info(统计)和erlang:now()

我需要知道平均速度是微秒。我不知道为什么我在编写脚本时遇到问题。

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

是否有人已经解决了这个问题?

编辑:

如果有人可以提供脚本来表达,那么愿意给予赏金。它需要通过多个流程来实施“。我不能接受像计时器这样的函数..至少在我见过的实现中。 IT只遍历一个进程,即使这样,一个完整的程序的完整测试也需要一些主要的编辑。希望我说得够清楚。

4 个答案:

答案 0 :(得分:38)

以下是如何使用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将所有进程的运行时间折叠为单个表(有关更多选项,请参阅manual):

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%,erl_eval需要另外16.67%(这就是你在shell中运行短函数的原因 - 解析它们比运行它们更长)。

然后你可以从那里开始。这是使用Erlang分析运行时间的基础知识。小心处理,eprof可能是生产系统或运行时间过长的功能的负担。特别是在生产系统上。

答案 1 :(得分:5)

您可以使用eprof or fprof

答案 2 :(得分:3)

执行此操作的常规方法是使用timer:tc。 Here是一个很好的解释。

答案 3 :(得分:0)

我可以向您推荐此工具: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