Oto jak korzystać eprof, prawdopodobnie najłatwiejsze rozwiązanie dla Ciebie:
Najpierw trzeba go uruchomić, jak większości zastosowań tam:
23> eprof:start().
{ok,<0.95.0>}
Eprof obsługuje dwa tryb profilowania. Możesz go wywołać i poprosić o profilowanie określonej funkcji, ale nie możemy tego użyć, ponieważ inne procesy wszystko zepsują. Musimy ręcznie uruchomić profilowanie i powiedzieć, kiedy się zatrzymać (dlatego nie będziesz miał łatwego skryptu, nawiasem mówiąc).
24> eprof:start_profiling([self()]).
profiling
Powoduje to, że program eprof profiluje wszystko, co będzie uruchamiane i odradzane z powłoki. Nowe procesy zostaną uwzględnione tutaj. Będę uruchomić jakąś dowolną funkcję Multiprocessing mam, które spawns około 4 procesy komunikują się ze sobą przez kilka sekund:
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> ...
Możemy teraz powiedzieć eprof zatrzymać profilowanie gdy funkcja jest wykonywana uruchomiony.
26> eprof:stop_profiling().
profiling_stopped
I chcemy dzienników. Eprof domyślnie wydrukuje je na ekranie. Możesz poprosić go również o zalogowanie się do pliku z numerem eprof:log(File)
. Następnie możesz powiedzieć, aby przeanalizować wyniki. Powiemy go zwinąć czas pracy ze wszystkich procesów w jednej tabeli z opcją total
(patrz manual po więcej informacji):
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]
i widać, że przez większość czasu (50%) jest przeznaczana w dict: store/3. 16,67% jest brane pod uwagę przy wyprowadzaniu wyniku, kolejne 16,67% jest brane pod uwagę przez erl_eval (dlatego uruchamiasz krótkie funkcje w powłoce - parsowanie ich trwa dłużej niż ich uruchomienie).
Możesz zacząć od tego miejsca. To jest podstawa profilowania czasów pracy z Erlangiem. Zachowaj ostrożność, eprof może stanowić duże obciążenie dla systemu produkcyjnego lub dla funkcji działających zbyt długo. Zwłaszcza w systemie produkcyjnym.
Istnieje kilka ungivens: Czy to jest system produkcyjny? 'eprof' i * szczególnie *' fprof' przynoszą wydajność podczas działania. Oba mogą śledzić nowo zarodkowane procesy. Możesz chcieć zmierzyć coś innego, jak np. Wycieczki w sieci i tak dalej! Najprostszym sposobem jest prawdopodobnie wstrzyknięcie wywołania 'timer: tc' wokół mierzonej funkcji. Alternatywnie, weź 'erlang: now()' i wyślij go do innego procesu, który może następnie wykonać pracę pomiarową. –
Twój skrypt eprofrogramowy (lub przewodnik) znajduje się niżej na stronie :) –