我感兴趣的板凳-标记我的程序的不同部分的速度。我试过使用info(statistics)和erlang:now()
我需要知道平均速度是多少微秒。我不知道为什么我写的剧本有问题。
它应该可以在任何地方开始,在任何地方结束。当我尝试在可能并行运行四次的进程上启动它时,我遇到了一个问题。
有没有人已经找到了解决这个问题的办法?
编辑:
如果有人能提供剧本来做的话,愿意给予赏金。它需要通过多个进程产生‘。我不能接受像计时器这样的功能。至少在我看到的实现中。它只遍历一个进程,即使这样,对完整程序的全面测试也需要一些重要的编辑。希望我说得够清楚了。
发布于 2010-12-04 15:19:19
下面是如何使用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对于生产系统或运行时间太长的功能来说可能是一个相当大的负载。尤其是在生产系统上。
发布于 2010-12-01 23:20:44
您可以使用eprof或fprof。
发布于 2010-12-01 22:50:25
正常的方法是使用计时器:tc。这里是一个很好的解释。
https://stackoverflow.com/questions/4329893
复制相似问题