ERLANG - Сроки применения - PullRequest
       4

ERLANG - Сроки применения

13 голосов
/ 02 декабря 2010

Я заинтересован в тестировании различных частей моей программы на скорость.Я попытался использовать info (статистику) и erlang: now ()

Мне нужно до микросекунды знать, какова средняя скорость.Я не знаю, почему у меня проблемы с написанным мной сценарием.

Он должен начинаться где угодно и заканчиваться где угодно.Я столкнулся с проблемой, когда попытался запустить ее в процессе, который может выполняться до 4 раз параллельно.

Есть ли кто-нибудь, у кого уже есть решение этой проблемы?

РЕДАКТИРОВАТЬ:

Желание дать вознаграждение, если кто-то может предоставить сценарий для этого.ЭТО НУЖНО СОЗДАТЬ, хотя несколько процессов ».Я не могу принять функцию, такую ​​как таймер .. по крайней мере, в реализациях, которые я видел.Информационные технологии охватывают только один процесс, и даже тогда для полного тестирования полной программы требуется некоторое серьезное редактирование.Надеюсь, я прояснил это достаточно.

Ответы [ 4 ]

38 голосов
/ 04 декабря 2010

Вот как использовать 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 может стать большой нагрузкой для производственной системы или для функций, которые работают слишком долго.Особенно в производственной системе.

5 голосов
/ 02 декабря 2010

Вы можете использовать eprof или fprof .

3 голосов
/ 02 декабря 2010

Обычный способ сделать это с помощью таймера: tc. Здесь - хорошее объяснение.

0 голосов
/ 26 ноября 2013

Я могу порекомендовать вам этот инструмент: https://github.com/virtan/eep

В результате вы получите что-то вроде https://raw.github.com/virtan/eep/master/doc/sshot1.png.

Пошаговая инструкция для профилирования всех процессов в работающей системе:

В целевой системе:

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

На рабочем столе:

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