Description
eprof是個時間相關的分析工具。可以統計某個進程在一段時間內的函數調用次數。
使用eprof時,可能會影響程序的執行速度。
Demo
start() ->
%% 啓動eprof服務
eprof:start(),
%% 監控self()執行函數的過程
eprof:profile([self()], ?MODULE, fibo, [15]),
%% 分析結果
eprof:analyze().
fibo(0) -> 0 ;
fibo(1) -> 1 ;
fibo(N) when N > 0 -> fibo(N-1) + fibo(N-2) .
結果
****** Process <0.90.0> -- 0.00 % of profiled time ***
FUNCTION CALLS % TIME [uS / CALLS]
-------- ----- ------- ---- [----------]
test:fibo/1 1973 0.00 0 [ 0.00]
----------- ----- ------- ---- [----------]
Total: 1973 100.00% 0 [ 0.00]
英 | 中 |
---|---|
FUNCTION | 模塊名:函數 |
CALLS | 調用次數 |
% | 佔統計時間的百分比 |
TIME | 執行時間(uS) |
uS / CALLS | 執行時間 / 調用次數 |
API
start() -> {ok,Pid} | {error,Reason}
啓動保存所收集數據的Eprof服務。
stop() -> stopped
停止eprof服務器。
profile(Rootset) -> profiling | {error, Reason}
profile(Rootset,Module,Function,Args) -> {ok, Value} | {error,Reason}
Types
- Rootset = [atom() | pid()]
- Module = Function = atom()
- Args = [term()]
這個函數是讓eprof收集某個Pid的數據。這裏只介紹常用的兩個。
- profile/1 Rootset可以是Pid,也可以是Pid註冊時的別名。
- profile/4 Module,Function,Args分別對應某pid執行某函數
analyze() -> ok
analyze(Type) -> ok
analyze(Type,Options) -> ok
Types
- Type = procs(分進程) | total(全部進程)
- Options = [{filter, Filter} | {sort, Sort}
- Filter = [{calls, integer()} 大於某調用次數 | {time, float()} 大於 某時間 ]
- Sort = time(時間升序) | calls(調用次數升序) | mfa (求告知)
調用此函數時,停止分析並顯示每個進程的分析結果。
log(File) -> ok
該函數將分析的結果analyze/0,1,2打印到文件中。
start_profiling/1,2,3
相當於eprof:start + eprof:profile
stop_profiling() -> profiling_stopped | profiling_already_stopped
停止由start_profiling/1或profile/1開始的分析。