BAR*_*BAR 14 erlang performance timing
我有兴趣对我的程序的不同部分进行基准测试以获得速度.我尝试过使用info(统计)和erlang:now()
我需要知道微秒的平均速度是多少.我不知道为什么我在编写脚本时遇到问题.
它应该能够从任何地方开始并在任何地方结束.当我尝试在一个可能并行运行多达4次的进程上启动它时,我遇到了一个问题.
是否有人已经解决了这个问题?
编辑:
如果有人可以提供脚本来做,那么愿意给予赏金.它需要通过多个流程来实施".我不能接受像计时器这样的函数..至少在我见过的实现中.IT只遍历一个进程,即使这样,一个完整的程序的完整测试也需要一些主要的编辑.希望我说得够清楚.
I G*_*ICE 38
以下是如何使用eprof,这可能是最简单的解决方案:
首先,您需要启动它,就像大多数应用程序一样:
23> eprof:start().
{ok,<0.95.0>}
Run Code Online (Sandbox Code Playgroud)
Eprof支持两种分析模式.你可以调用它并要求分析某个功能,但是我们不能使用它,因为其他进程会搞乱一切.我们需要手动启动它的分析并告诉它何时停止(顺便说一下,这就是为什么你没有一个简单的脚本).
24> eprof:start_profiling([self()]).
profiling
Run Code Online (Sandbox Code Playgroud)
这告诉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> ...
Run Code Online (Sandbox Code Playgroud)
现在我们可以告诉eprof在函数运行完毕后停止分析.
26> eprof:stop_profiling().
profiling_stopped
Run Code Online (Sandbox Code Playgroud)
我们想要日志.默认情况下,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]
Run Code Online (Sandbox Code Playgroud)
你可以看到大部分时间(50%)花在dict:store/3上.输出结果需要16.67%,erl_eval需要另外16.67%(这就是你在shell中运行短函数的原因 - 解析它们比运行它们更长).
然后你可以从那里开始.这是使用Erlang分析运行时间的基础知识.小心处理,eprof可能是生产系统或运行时间过长的功能的负担.特别是在生产系统上.