Spec-Zone.ru › Elixir 1.11

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

Spec-Zone.ru

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