2010-12-01 16 views
12

Sono interessato al benchmarking di diverse parti del mio programma per la velocità. Ho provato a utilizzare le informazioni (statistiche) ed erlang: now()ERLANG - Applicazioni di temporizzazione

Ho bisogno di sapere fino al microsecondo qual è la velocità AVG. Non so perché sto avendo problemi con una sceneggiatura che ho scritto.

Dovrebbe essere in grado di avviare ovunque e terminare ovunque. Ho avuto un problema quando ho provato ad avviarlo su un processo che può essere eseguito fino a 4 volte in parallelo.

C'è qualcuno che ha già una soluzione a questo problema?

EDIT:

disposto a dare una taglia se qualcuno può fornire uno script per farlo. HA BISOGNO DI SPAGNERE anche se più processi ". Non posso accettare una funzione come il timer .. almeno nelle implementazioni che ho visto. IT attraversa solo un processo e anche in questo caso è necessario apportare alcune modifiche importanti per un test completo di un programma completo. Spero di averlo chiarito abbastanza.

+0

ci sono un paio di ungivens: Si tratta di una sistema di produzione? 'eprof' e * specialmente *' fprof' causano un calo di prestazioni durante l'esecuzione. Entrambi possono seguire proceses appena generati. Potresti voler misurare qualcos'altro come round-trips della rete e così via comunque! Il modo più semplice è probabilmente quello di iniettare una chiamata 'timer: tc' attorno alla funzione da misurare. In alternativa, prendi 'erlang: now()' e spediscilo ad un altro processo che può quindi eseguire il lavoro di misurazione. –

+0

hai il tuo script eprof (o walkthrough) più in basso nella pagina :) –

risposta

38

Ecco come utilizzare eprof, probabilmente la soluzione più semplice per voi:

In primo luogo è necessario avviarlo, come la maggior parte delle applicazioni là fuori:

23> eprof:start(). 
{ok,<0.95.0>} 

Eprof supporta due modalità di profilazione. Puoi chiamarlo e chiedere di profilare una determinata funzione, ma non possiamo usarlo perché altri processi rovinano tutto. Dobbiamo avviarlo manualmente al profiling e dirgli quando smettere (questo è il motivo per cui non avrai uno script semplice, a proposito).

24> eprof:start_profiling([self()]). 
profiling 

Questo dice a eprof di profilare tutto ciò che verrà eseguito e generato dalla shell. Nuovi processi saranno inclusi qui. Corro qualche funzione multiprocessing arbitraria che ho, che genera circa 4 processi comunicanti tra di loro per un paio di secondi:

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

ora possiamo dire eprof per fermare profiling una volta la funzione è fatto in esecuzione.

26> eprof:stop_profiling(). 
profiling_stopped 

E vogliamo i registri. Eprof le stamperà sullo schermo per impostazione predefinita. Puoi chiedere di accedere anche a un file con eprof:log(File). Quindi puoi dirlo per analizzare i risultati. Noi diciamo che per comprimere la fase di esecuzione da tutti i processi in un'unica tabella con l'opzione total (vedi la manual per ulteriori opzioni):

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] 

e si può vedere che la maggior parte del tempo (50%) viene speso in dict: store/3. Il 16,67% viene preso in output del risultato, un altro 16,67% viene preso da erl_eval (questo è il motivo per cui si ottiene eseguendo brevi funzioni nella shell - l'analisi di esse diventa più lunga rispetto a eseguirle).

È quindi possibile iniziare a partire da lì. Ecco le basi della profiling run time con Erlang. Maneggiare con cura, eprof può essere un bel carico per un sistema di produzione o per funzioni che funzionano troppo a lungo. Soprattutto su un sistema di produzione.

+0

Nice Work man, l'ho provato, sembra carino .. Una domanda: perché alcuni processano 'dicono 0 chiamate nel mio prog? So che doveva essere chiamato per avere altri divertimenti come le liste: si appiattisce. È qualcosa di ovvio? O un po 'più esoterico al mio prog. – BAR

+0

Non saprei dire senza il codice - non ricordo di averlo visto nel mio codice. –

3

Il modo normale per farlo è con il timer: tc. Here è una buona spiegazione.

+0

Ho bisogno di eseguire il processo 'non solo testare uno. – BAR

+1

'eprof' è lo strumento che desideri. –

0

ti posso consigliare questo strumento: https://github.com/virtan/eep

Otterrete qualcosa di simile https://raw.github.com/virtan/eep/master/doc/sshot1.png come risultato.

Passo per passo le istruzioni per profilatura tutti i processi sul sistema in esecuzione:

Sul sistema di destinazione:

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

Sul desktop:

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