mix profile.cprof
Профилирует указанный файл или выражение с помощью инструмента Erlang's cprof.
cprof может быть полезно, когда вы хотите обнаружить узкие места, связанные с вызовами функций.
Перед запуском кода вызывается задача app.start, которая компилирует и загружает ваш проект. После этого целевое выражение профилируется вместе со всеми соответствующими вызовами функций, путем установки точек останова, содержащих счетчики. Эти точки останова могут быть установлены только на коде BEAM, поэтому на BIF нельзя отслеживать количество вызовов.
Для профилирования кода вы можете использовать синтаксис, аналогичный задаче mix run:
mix profile.cprof -e Hello.world mix profile.cprof -e "[1, 2, 3] |> Enum.reverse |> Enum.map(&Integer.to_string/1)" mix profile.cprof my_script.exs arg1 arg2 arg3
Эта задача автоматически повторно активируется, поэтому вы можете выполнять профилирование несколько раз в одном вызове Mix.
Параметры командной строки
-
--matching- только профилировать вызовы, соответствующие заданномуModule.function/arityшаблону -
--limit- отфильтровывает любые результаты с количеством вызовов меньше предела -
--module- отфильтровывает любые результаты, не относящиеся к указанному модулю -
--eval,-e- вычислять указанный код -
--require,-r- требуется шаблон перед запуском команды -
--parallel,-p- делает все зависимости параллельными -
--no-compile- не компилировать, даже если файлы требуют компиляции -
--no-deps-check- не проверять зависимости -
--no-archives-check- не проверять архивы -
--no-halt- не останавливать систему после выполнения команды -
--no-start- не запускать приложения после компиляции -
--no-elixir-version-check- не проверять версию Elixir из mix.exs
Вывод профиля
Пример вывода:
CNT Total 15 Enum 6 <-- Enum."-map/2-lists^map/1-0-"/2 4 Enum.reverse/1 1 Enum.map/2 1 :elixir_compiler 4 <-- anonymous fn/1 in :elixir_compiler.__FILE__/1 3 anonymous fn/0 in :elixir_compiler.__FILE__/1 1 String.Chars.Integer 3 <-- String.Chars.Integer.to_string/1 3 :erlang 2 <-- :erlang.trace_pattern/3 2 Profile done over 20229 matching functions
Вывод по умолчанию содержит данные, собранные от всех соответствующих функций. В левой колонке расположены структуры модулей, а в правой — общее отслеживание количества вызовов. Каждый модуль имеет свою разницу в количестве вызовов для каждой функции ниже. Символ <-- призван помочь визуализировать, где начинается новое количество вызовов модуля.
Первая строка (Всего) — это сумма всех вызовов функций. В последней строке представлено количество соответствующих функций, которые были рассмотрены для профилирования.
Когда задан параметр --matching, отслеживание количества вызовов будет запущено только для функций, соответствующих заданному шаблону:
String.Chars.Integer 3 <-- String.Chars.Integer.to_string/1 3 Profile done over 1 matching functions
Шаблон может быть именем модуля, например String, чтобы подсчитать все вызовы этому модулю, вызов без арности, например String.split, чтобы подсчитать все вызовы этой функции независимо от арности, или вызов с арностью, например String.split/2, чтобы подсчитать все вызовы этому точному модулю, функции и арности.
Ограничения
Вы должны знать, что профилировщик останавливается, как только код завершает выполнение. Это может потребовать особого внимания при: работе с асинхронным кодом, так как вызовы функций, которые были вызваны до остановки профилировщика, не будут учтены; работе со синхронным кодом, так как длительные вычисления и профилировщик без соответствующего шаблона отслеживания MFA или фильтра могут привести к результату, который сложно понять.
Другие ограничения — невозможность отслеживать количество вызовов BIF, так как точки останова могут быть установлены только на коде BEAM; вызовы функций, выполняемые :cprof, не отслеживаются; максимальный размер счетчика вызовов равен размеру слова процессора хоста (например, 2147483647 на 32-битном хосте).
Резюме
Функции
- profile(fun, opts \\ [])
Позволяет программно запустить профилировщик
cprofна выражении вfun.
Функции
profile(fun, opts \\ [])Source
Позволяет программно запустить профилировщик cprof на выражении в fun.
Параметры
-
:matching- только профилировать вызовы, соответствующие заданному шаблону в форме{module, function, arity}, где каждый элемент может быть заменён на:_, чтобы разрешить любое значение -
:limit- отфильтровывает любые результаты с количеством вызовов меньше предела -
:module- отфильтровывает любые результаты, не относящиеся к указанному модулю
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Profile.Cprof.html