mix profile.fprof
Профилирует указанный файл или выражение с помощью инструмента Erlang's fprof.
fprof может быть полезно, когда вы хотите обнаружить узкие места в последовательном коде.
Перед выполнением кода вызывается задача app.start, которая компилирует и загружает ваш проект. Затем профилируется целевое выражение вместе со всеми процессами, которые генерируются им. Другие процессы (например, те, которые находятся в дереве надзора приложения OTP) не профилируются.
Для профилирования кода можно использовать синтаксис, аналогичный задаче mix run:
mix profile.fprof -e Hello.world mix profile.fprof my_script.exs arg1 arg2 arg3
Эта задача автоматически повторно включается, поэтому вы можете профилировать несколько раз в одном вызове Mix.
Параметры командной строки
-
--callers- выводит подробную информацию об непосредственных вызывающих функциях и вызываемых функциях -
--details- включает данные профиля для каждого профилируемого процесса -
--sort key- сортирует вывод по заданному ключу:acc(по умолчанию) илиown -
--eval,-e- оценивает заданный код -
--require,-r- требует шаблона перед запуском команды -
--parallel,-p- делает все зависимости параллельными -
--no-compile- не компилирует, даже если файлы требуют компиляции -
--no-deps-check- не проверяет зависимости -
--no-archives-check- не проверяет архивы -
--no-start- не запускает приложения после компиляции -
--no-elixir-version-check- не проверяет версию Elixir из mix.exs -
--no-warmup- не выполняет код один раз перед профилированием
Вывод профиля
Пример вывода:
# CNT ACC (ms) OWN (ms) Total 200279 1972.188 1964.579 :fprof.apply_start_stop/4 0 1972.188 0.012 anonymous fn/0 in :elixir_compiler_2 1 1972.167 0.001 Test.run/0 1 1972.166 0.007 Test.do_something/1 3 1972.131 0.040 Test.bottleneck/0 1 1599.490 0.007 ...
Вывод по умолчанию содержит данные, собранные от всех профилируемых процессов. Все времена указаны в миллисекундах реального времени. Столбцы имеют следующее значение:
- CNT - общее количество вызовов данной функции
- ACC - общее время, затраченное в функции
- OWN - время, затраченное в функции, за исключением времени вызываемых функций
Первая строка (Total) — это сумма всех функций, выполняемых во всех профилируемых процессах. В данном выводе было выполнено 200279 вызовов функций и потрачено около 2 секунд на выполнение кода.
Более подробная информация возвращается, если вы укажете опции --callers и --details.
При указании опции --callers, вы увидите расширенные записи функций:
Mod.caller1/0 3 200.000 0.017
Mod.caller2/0 2 100.000 0.017
Mod.some_function/0 5 300.000 0.017 <--
Mod.called1/0 4 250.000 0.010
Mod.called2/0 1 50.000 0.030
Здесь стрелка (<--) указывает на подчеркнутую функцию — функцию, описанную в данном абзаце. Вы также видите её непосредственных вызывающих функции (выше) и вызываемые функции (ниже).
Все значения вызывающих функций описывают подчеркнутую функцию. Например, первая строка означает, что Mod.caller1/0 вызвала Mod.some_function/0 3 раза. 200 мс из общего времени, потраченного в Mod.some_function/0, были потрачены на обработку вызовов от этого конкретного вызывающего.
В отличие от этого, значения для вызываемых функций описывают эти функции, но в контексте подчеркнутой функции. Например, последняя строка означает, что Mod.called2/0 была вызвана Mod.some_function/0 один раз, и в этом случае общее время, затраченное в функции, составило 50 мс.
Для подробного объяснения стоит прочитать анализ в документации Erlang/OTP для fprof.
Ограничения
Вы должны понимать, что профилируемый код выполняется в анонимной функции, которая вызывается модулем :fprof. Таким образом, в выводе профиля будут отображаться дополнительные записи, такие как вызовы :fprof, анонимная функция с высоким значением ACC или функция :undefined, которая представляет внешний вызывающий (код, не профилируемый, который запустил профилировщик).
Также следует учитывать, что профилирование может значительно увеличить время выполнения профилируемых процессов. Это может исказить результаты, если, например, эти процессы выполняют операции ввода-вывода, поскольку время выполнения этих операций останется неизменным, в то время как операции с использованием процессора профилируемых процессов могут занимать значительно больше времени. Поэтому при профилировании какой-либо интенсивной программы попробуйте уменьшить такие зависимости или учитывайте возникающее смещение.
Наконец, рекомендуется профилировать программу в среде prod, так как это должно предоставить более реалистичные сведения об узких местах.
Краткое описание
Функции
- profile(fun, opts \\ [])
Позволяет программно запустить профилировщик
fprofна выражении вfun.
Функции
profile(fun, opts \\ [])
Позволяет программно запустить профилировщик fprof на выражении в fun.
Параметры
-
:callers- выводит подробную информацию об непосредственных вызывающих функциях и вызываемых функциях -
:details- включает данные профиля для каждого профилируемого процесса -
:sort- сортирует вывод по заданному ключу::acc(по умолчанию) или:own
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.11.2/Mix.Tasks.Profile.Fprof.html