Spec-Zone.ru › Elixir 1.11

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 \\ [])

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

Параметры

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

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

Spec-Zone.ru

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