Spec-Zone.ru › Elixir 1.12

mix profile.eprof

Профилирует заданный файл или выражение с помощью инструмента Erlang's eprof.

:eprof предоставляет информацию о времени каждого вызова функции и может быть полезным, когда вы хотите обнаружить узкие места, связанные с этим.

Перед выполнением кода вызывается задача app.start, которая компилирует и загружает ваш проект. После этого целевое выражение профилируется вместе со всеми соответствующими вызовами функций с помощью функций отслеживания Erlang. Отслеживание вызовов функций включено при запуске профилирования и выключено при остановке профилирования.

Для профилирования кода можно использовать синтаксис, аналогичный задаче mix run:

mix profile.eprof -e Hello.world
mix profile.eprof -e "[1, 2, 3] |> Enum.reverse |> Enum.map(&Integer.to_string/1)"
mix profile.eprof my_script.exs arg1 arg2 arg3

Эта задача автоматически повторно включается, поэтому вы можете выполнять профилирование несколько раз в одном вызове Mix.

Параметры командной строки

  • --matching - только профилировать вызовы, соответствующие заданному Module.function/arity шаблону
  • --calls - отфильтровывать любые результаты с количеством вызовов меньше указанного
  • --time - отфильтровывать любые результаты, которые заняли меньше указанного времени (в мкс)
  • --sort - сортировать результаты по time или calls (по умолчанию: time)
  • --eval, -e - вычисляет заданный код
  • --require, -r - требует шаблона перед выполнением команды
  • --parallel, -p - делает все зависимости параллельными
  • --no-warmup - пропускает этап разогрева перед профилированием
  • --no-compile - не компилировать, даже если файлы требуют компиляции
  • --no-deps-check - не проверять зависимости
  • --no-archives-check - не проверять архивы
  • --no-halt - не останавливать систему после выполнения команды
  • --no-start - не запускать приложения после компиляции
  • --no-elixir-version-check - не проверять версию Elixir из mix.exs

Вывод профиля

Пример вывода:

#                                               CALLS     % TIME µS/CALL
Total                                              24 100.0   26    1.08
Enum.reduce_range_inc/4                             5  3.85    1    0.20
:erlang.make_fun/3                                  1  7.69    2    2.00
Enum.each/2                                         1  7.69    2    2.00
anonymous fn/0 in :elixir_compiler_0.__FILE__/1     1  7.69    2    2.00
:erlang.integer_to_binary/1                         5 15.39    4    0.80
:erlang.apply/2                                     1 15.39    4    4.00
anonymous fn/3 in Enum.each/2                       5 19.23    5    1.00
String.Chars.Integer.to_string/1                    5 23.08    6    1.20

Profile done over 8 matching functions

Вывод по умолчанию содержит данные, собранные со всех соответствующих функций. Первая строка после заголовка содержит суммы частичных результатов и среднее время для всех вызовов функций, перечисленных в списке. Следующие строки содержат вызов функции, количество раз, когда функция была вызвана, процент времени, который занимает вызов, общее время для этой функции в микросекундах и, наконец, среднее время на вызов в микросекундах.

Если указан параметр --matching, отслеживание количества вызовов будет запущено только для функций, соответствующих заданному шаблону:

#                                               CALLS     % TIME µS/CALL
Total                                               5 100.0    6    1.20
String.Chars.Integer.to_string/1                    5 100.0    6    1.20

Profile done over 1 matching functions

Шаблон может быть именем модуля, например String для подсчета всех вызовов этого модуля, вызова без арности, например String.split, для подсчета всех вызовов этой функции независимо от арности, или вызова с арностью, например String.split/2, для подсчета всех вызовов этого модуля, функции и арности.

Ограничения

Следует знать, что профилируемый код выполняется в анонимной функции, которая вызывается модулем :eprof. Таким образом, в выводе профиля будут отображаться дополнительные записи. Также важно отметить, что профилировщик останавливается, как только код завершит выполнение, и это может потребовать особого внимания при: выполнении асинхронного кода, так как вызовы функций, которые были вызваны до остановки профилировщика, не будут учтены; выполнении синхронного кода, так как длительные вычисления и профилировщик без соответствующего шаблона или фильтра MFA могут привести к результату, который трудно понять.

Следует ожидать замедления выполнения вашего кода при использовании этого инструмента, так как :eprof оказывает некоторое влияние на производительность, но это влияние значительно меньше, чем у Mix.Tasks.Profile.Fprof. Если у вас большая система, попробуйте профилировать ограниченный сценарий или сосредоточьтесь на основных модулях или процессах. Еще один вариант — использовать Mix.Tasks.Profile.Cprof, который использует :cprof и имеет низкое влияние на производительность.

Резюме

Функции

profile(fun, opts \\ [])

Позволяет программно запустить профилировщик eprof на выражении в fun.

Функции

profile(fun, opts \\ [])Source

Позволяет программно запустить профилировщик eprof на выражении в fun.

Параметры

  • :matching - только профилировать вызовы, соответствующие заданному шаблону в форме {module, function, arity}, где каждый элемент может быть заменён на :_ для разрешения любого значения
  • :calls - отфильтровывать любые результаты с количеством вызовов меньше указанного
  • :time - отфильтровывать любые результаты, которые заняли меньше указанного времени (в мкс)
  • :sort - сортировать результаты по :time или :calls (по умолчанию: :time)

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Profile.Eprof.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API