Подтвердить что ты не робот

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

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

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

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

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

EDIT:

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

4b9b3361

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

Ответ 3

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

Ответ 4

Я могу порекомендовать вам этот инструмент: 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