mix profile.eprof
Профилирует заданный файл или выражение с помощью инструмента Erlang's eprof.
:eprof предоставляет информацию о времени каждого вызова функции и может быть полезно, когда вы хотите обнаружить узкие места, связанные с этим.
Перед запуском кода вызывается задача app.start, которая компилирует и загружает ваш проект. Затем профилируется целевое выражение вместе со всеми соответствующими вызовами функций с использованием Erlang trace BIF. Отслеживание вызовов функций включено при запуске профилирования и выключено при остановке профилирования.
Для профилирования кода можно использовать синтаксис, аналогичный задаче 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 \\ [])
Позволяет программно запустить профилировщик 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.11.2/Mix.Tasks.Profile.Eprof.html