mix profile.eprof
Профилирует заданный файл или выражение с помощью инструмента Erlang's eprof.
:eprof предоставляет информацию о времени каждого вызова функции и может быть полезным, когда вы хотите обнаружить узкие места, связанные с этим.
Перед выполнением кода вызывается задача app.start, которая компилирует и загружает ваш проект. После этого целевое выражение профилируется вместе со всеми соответствующими вызовами функций с помощью функций отслеживания Erlang. Отслеживание вызовов функций включено при запуске профилирования и выключено при остановке профилирования.
Для профилирования кода можно использовать синтаксис, аналогичный задаче mix run:
mix profile.eprof -e Hello.world mix profile.eprof -e "[1, 2, 3] |> Enum.reverse |> Enum.map(&Integer.to_string/1)" mix profile.eprof my_script.exs arg1 arg2 arg3
Эта задача автоматически повторно включается, поэтому вы можете выполнять профилирование несколько раз в одном вызове Mix.
Параметры командной строки
-
--matching- только профилировать вызовы, соответствующие заданномуModule.function/arityшаблону -
--calls- отфильтровывать любые результаты с количеством вызовов меньше указанного -
--time- отфильтровывать любые результаты, которые заняли меньше указанного времени (в мкс) -
--sort- сортировать результаты поtimeилиcalls(по умолчанию:time) -
--eval,-e- вычисляет заданный код -
--require,-r- требует шаблона перед выполнением команды -
--parallel,-p- делает все зависимости параллельными -
--no-warmup- пропускает этап разогрева перед профилированием -
--no-compile- не компилировать, даже если файлы требуют компиляции -
--no-deps-check- не проверять зависимости -
--no-archives-check- не проверять архивы -
--no-halt- не останавливать систему после выполнения команды -
--no-start- не запускать приложения после компиляции -
--no-elixir-version-check- не проверять версию Elixir из mix.exs
Вывод профиля
Пример вывода:
# CALLS % TIME µS/CALL Total 24 100.0 26 1.08 Enum.reduce_range_inc/4 5 3.85 1 0.20 :erlang.make_fun/3 1 7.69 2 2.00 Enum.each/2 1 7.69 2 2.00 anonymous fn/0 in :elixir_compiler_0.__FILE__/1 1 7.69 2 2.00 :erlang.integer_to_binary/1 5 15.39 4 0.80 :erlang.apply/2 1 15.39 4 4.00 anonymous fn/3 in Enum.each/2 5 19.23 5 1.00 String.Chars.Integer.to_string/1 5 23.08 6 1.20 Profile done over 8 matching functions
Вывод по умолчанию содержит данные, собранные со всех соответствующих функций. Первая строка после заголовка содержит суммы частичных результатов и среднее время для всех вызовов функций, перечисленных в списке. Следующие строки содержат вызов функции, количество раз, когда функция была вызвана, процент времени, который занимает вызов, общее время для этой функции в микросекундах и, наконец, среднее время на вызов в микросекундах.
Если указан параметр --matching, отслеживание количества вызовов будет запущено только для функций, соответствующих заданному шаблону:
# CALLS % TIME µS/CALL Total 5 100.0 6 1.20 String.Chars.Integer.to_string/1 5 100.0 6 1.20 Profile done over 1 matching functions
Шаблон может быть именем модуля, например String для подсчета всех вызовов этого модуля, вызова без арности, например String.split, для подсчета всех вызовов этой функции независимо от арности, или вызова с арностью, например String.split/2, для подсчета всех вызовов этого модуля, функции и арности.
Ограничения
Следует знать, что профилируемый код выполняется в анонимной функции, которая вызывается модулем :eprof. Таким образом, в выводе профиля будут отображаться дополнительные записи. Также важно отметить, что профилировщик останавливается, как только код завершит выполнение, и это может потребовать особого внимания при: выполнении асинхронного кода, так как вызовы функций, которые были вызваны до остановки профилировщика, не будут учтены; выполнении синхронного кода, так как длительные вычисления и профилировщик без соответствующего шаблона или фильтра MFA могут привести к результату, который трудно понять.
Следует ожидать замедления выполнения вашего кода при использовании этого инструмента, так как :eprof оказывает некоторое влияние на производительность, но это влияние значительно меньше, чем у Mix.Tasks.Profile.Fprof. Если у вас большая система, попробуйте профилировать ограниченный сценарий или сосредоточьтесь на основных модулях или процессах. Еще один вариант — использовать Mix.Tasks.Profile.Cprof, который использует :cprof и имеет низкое влияние на производительность.
Резюме
Функции
- profile(fun, opts \\ [])
Позволяет программно запустить профилировщик
eprofна выражении вfun.
Функции
profile(fun, opts \\ [])Source
Позволяет программно запустить профилировщик eprof на выражении в fun.
Параметры
-
:matching- только профилировать вызовы, соответствующие заданному шаблону в форме{module, function, arity}, где каждый элемент может быть заменён на:_для разрешения любого значения -
:calls- отфильтровывать любые результаты с количеством вызовов меньше указанного -
:time- отфильтровывать любые результаты, которые заняли меньше указанного времени (в мкс) -
:sort- сортировать результаты по:timeили:calls(по умолчанию::time)
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Profile.Eprof.html