Профілювання
--profile FILE (параметр runtime, також
через CLAUSE_FLAGS) змушує програму записати звіт про витрати у FILE після
завершення. Нічого не перекомпільовується: кожен виконуваний файл може
профілюватися, а без цього параметра він працює, друкує й записує файли точно
так само. Якщо звіт не вдається записати, про це повідомляється в stderr
(clau: cannot write profile FILE); код завершення залишається кодом програми.
Атрибуція
Runtime приписує витрати там, де керування переходить між фреймами (модель виконання), без інструментування згенерованого коду:
- Входи (редукції): кожен вхід у функцію Erlang через виклик або хвостовий виклик зараховується цій функції як один, так само як квант часу рахує редукції.
- Власний час: час монотонного годинника від однієї передачі керування
(вхід, повернення, початок кванта часу) до наступної належить функції, чий
фрейм був на вершині. Вбудовані функції та служби runtime зараховуються як час
функції, що їх викликала; час, поки процес чекає або не запланований, не
зараховується нікому. Час до першого входу процесу — це
(runtime). - Для кожного процесу: кожен процес зберігає власні витрати; вони додаються до витрат програми, коли контекст процесу знищується, разом із його pid, підсумками та найдорожчою функцією.
Кожен увімкнений стек читає годинник при кожній передачі керування (приблизно на 8% повільніше на циклі з густими викликами в Debug); вимкнені стеки платять одне розгалуження за передачу.
Звіт
Clause profile: 2 processes, 503 time slices, 0 timer clock readings
Functions by self time:
time_us share entries function
1193261 100.0% 2000001 profile:spin/2
204 0.0% 1 profile:main/1
130 0.0% 1 profile:-main/1-fun-0-/1
0 0.0% 1 profile:cold/1
Processes by time:
time_us share entries process: top function
1193393 100.0% 2000002 <0.2.0>: profile:spin/2
206 0.0% 2 <0.1.0>: profile:main/1
Перший рядок також рахує кванти часу, які виконали робочі потоки планувальника,
і зчитування годинника потоком таймера тайм-аутів receive
(колесо таймерів). Функції подано як
module:function/arity (анонімні funs — за їхніми згенерованими іменами, арність
яких враховує захоплені значення); за рівності функції сортуються за іменем,
процеси — за часом, а потім за pid. Час подано в мікросекундах, і він
змінюється між запусками; кількість входів точна.
Тести
linking_profiling компонує tests/fixtures/linking/profile на O0 та O2 і
запускає його без профілювання, з --profile FILE і з
CLAUSE_FLAGS=--profile=FILE: вивід ідентичний, spin/2 посідає перше місце за
власним часом рівно з 2 000 001 входом, процес, що крутить цикл, посідає перше
місце, а --profile без файлу завершується з кодом 70.
Clause