Clause
← Уся документація

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · a8c3f8f6 · 2026-10-17

Профілювання

--profile FILE (параметр runtime, також через CLAUSE_FLAGS) змушує програму записати звіт про витрати у FILE після завершення. Нічого не перекомпільовується: кожен виконуваний файл може профілюватися, а без цього параметра він працює, друкує й записує файли точно так само. Якщо звіт не вдається записати, про це повідомляється в stderr (clau: cannot write profile FILE); код завершення залишається кодом програми.

Атрибуція

Runtime приписує витрати там, де керування переходить між фреймами (модель виконання), без інструментування згенерованого коду:

Кожен увімкнений стек читає годинник при кожній передачі керування (приблизно на 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.