2010-12-01 8 views
12

Jestem zainteresowany benchmarkingiem różnych części mojego programu na szybkość. Próbowałem używać informacji (statystyki) i erlang: teraz()ERLANG - Timing Applications

Muszę wiedzieć do mikrosekund, co jest średnia prędkość. Nie wiem, dlaczego mam problem ze skryptem, który napisałem.

Powinien być w stanie rozpocząć w dowolnym miejscu i zakończyć w dowolnym miejscu. Wystąpił problem, gdy próbowałem uruchomić go na proces, który może być uruchomiony do 4 razy równolegle.

Czy jest ktoś, kto już ma rozwiązanie tego problemu?

EDIT:

Chcąc dać nagrodę, jeśli ktoś może dostarczyć skryptu, aby to zrobić. TO POTRZEBUJE SIĘ SPAWNIEJ mimo wielu procesów ". Nie mogę zaakceptować funkcji takiej jak timer ... przynajmniej w implementacjach, które widziałem. IT przechodzi tylko jeden proces, a nawet wtedy konieczna jest większa edycja w celu pełnego przetestowania pełnego programu. Mam nadzieję, że jasno to wyjaśniłem.

+0

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ą. –

+0

Twój skrypt eprofrogramowy (lub przewodnik) znajduje się niżej na stronie :) –

Odpowiedz

38

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.

+0

Miły człowiek pracy, wypróbowany to, wygląda ładnie .. Pytanie: Dlaczego jakiś proces "powiedz 0 wywołań w moim progu? Wiem, że musiało zostać wywołane, aby mieć jakieś inne funkcje, takie jak listy: spłaszczaj się. Czy to coś oczywistego? Albo trochę bardziej ezoteryczny dla mojego progu. – BAR

+0

Nie mogłem powiedzieć bez kodu - nie pamiętam, żeby zobaczyłem to w moim własnym kodzie. –

3

Normalnym sposobem wykonania tej czynności jest timer: tc. Here to dobre wytłumaczenie.

+0

Potrzebuję go, aby uruchomić proces "nie tylko testowy. – BAR

+1

'eprof' jest narzędziem, które chcesz. –

0

mogę polecić tego narzędzia: https://github.com/virtan/eep

dostaniesz coś takiego https://raw.github.com/virtan/eep/master/doc/sshot1.png wyniku.

Krok po kroku instrukcje do profilowania wszystkich procesów w systemie uruchomiony:

W systemie docelowym:

1> eep:start_file_tracing("file_name"), timer:sleep(20000), eep:stop_tracing(). 
$ scp -C $PWD/file_name.trace desktop: 

Na pulpicie:

1> eep:convert_tracing("file_name"). 
$ kcachegrind callgrind.out.file_name