erlang性能分析-eprof

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

  1. Rootset = [atom() | pid()]
  2. Module = Function = atom()
  3. Args = [term()]

這個函數是讓eprof收集某個Pid的數據。這裏只介紹常用的兩個。

  1. profile/1 Rootset可以是Pid,也可以是Pid註冊時的別名。
  2. profile/4 Module,Function,Args分別對應某pid執行某函數

analyze() -> ok

analyze(Type) -> ok

analyze(Type,Options) -> ok

Types

  1. Type = procs(分進程) | total(全部進程)
  2. Options = [{filter, Filter} | {sort, Sort}
  3. Filter = [{calls, integer()} 大於某調用次數 | {time, float()} 大於 某時間 ]
  4. 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開始的分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章