Вот как использовать eprof, вероятно, самое простое решение для вас:
Сначала вам нужно запустить его, как и большинство других приложений:
23> eprof:start().
{ok,<0.95.0>}
Eprof поддерживает два режима профилирования.Вы можете вызвать его и попросить профилировать определенную функцию, но мы не можем использовать это, потому что другие процессы все испортят.Нам нужно вручную запустить его профилирование и указать, когда его остановить (поэтому, кстати, у вас не будет простого сценария).
24> eprof:start_profiling([self()]).
profiling
Это говорит eprof о необходимости профилировать все, что будет запущенои породил из скорлупы.Новые процессы будут включены сюда.Я запустю какую-нибудь произвольную многопроцессорную функцию, которая у меня будет, и которая порождает около 4 процессов, взаимодействующих друг с другом в течение нескольких секунд:
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> ...
Теперь мы можем сказать eprof прекратить профилирование после завершения работы функции.*
26> eprof:stop_profiling().
profiling_stopped
И нам нужны журналы.Eprof распечатает их на экране по умолчанию.Вы также можете попросить его войти в файл с eprof:log(File)
.Затем вы можете сказать это, чтобы проанализировать результаты.Мы говорим, чтобы свести время выполнения всех процессов в одну таблицу с параметром total
(дополнительные параметры см. В руководстве ):
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]
И вы можете видеть, чтоБольшую часть времени (50%) проводят в dict: store / 3.16,67% занято при выводе результата, еще 16,67% занято erl_eval (вот почему вы получаете запуск коротких функций в оболочке - их анализ становится длиннее, чем их запуск).
Затем вы можете запуститьидущий оттуда.Это основы профилирования времени выполнения с Erlang.Обращаясь с осторожностью, eprof может стать большой нагрузкой для производственной системы или для функций, которые работают слишком долго.Особенно в производственной системе.