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 \\ [])Source
Позволяет программно запустить профилировщик fprof на выражении в fun.
Параметры
-
:callers- выводит подробную информацию о непосредственных вызывающих функциях и вызываемых функциях -
:details- включает данные профиля для каждого профилируемого процесса -
:sort- сортирует вывод по заданному ключу::acc(по умолчанию) или:own
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Profile.Fprof.html