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.
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. –
hai il tuo script eprof (o walkthrough) più in basso nella pagina :) –