Ответ 1
Здесь, как использовать eprof, скорее всего, самое простое решение для вас:
Сначала вам нужно запустить его, как и большинство других приложений:
23> eprof:start().
{ok,<0.95.0>}
Eprof поддерживает два режима профилирования. Вы можете вызвать его и попросить профилировать определенную функцию, но мы не сможем использовать это, потому что другие процессы все испортят. Нам нужно вручную запустить его профилирование и сказать, когда остановиться (вот почему у вас не будет простого script, кстати).
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 может быть довольно загруженной на производственную систему или для функций, которые работают слишком долго. Особенно в производственной системе.