Spall — это библиотека профилировщика и веб-интерфейс для изучения вашего кода и выявления потенциальных проблем с производительностью.
^ это 180 МБ (эквивалент JSON 526 МБ), 5-минутная трассировка от Happenlance, любезно предоставлено @pmttavara!
Попробуйте это в Gravity Moth.
В состав spall входит небольшая библиотека C с одним заголовком, spall.h
.
Spall в настоящее время поддерживает 2 различных формата файлов:
perfetto
, chrome://tracing
и speedscope
, описанном ниже. Вы можете либо оснастить свой код нашим заголовком, либо использовать существующий код дампа JSON, совместимый с chrome://tracing
.
Если вы начинаете с нуля, вы, вероятно, захотите использовать заголовок расщепления для генерации событий. Двоичный формат требует гораздо меньших затрат на профилирование (поэтому ваши трассировки должны быть более точными) и обрабатываются примерно в 10 раз быстрее, чем формат JSON.
Если вы хотите использовать JSON, Spall ожидает событий в формате трассировки JSON Google. Они выглядят следующим образом:
[
{"cat":"function", "name":"main", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0}
]
(spall не заботится о конечных запятых, и закрывающие скобки не требуются, чтобы упростить создание файлов/потоковую передачу событий)
cat
- Категория события. В настоящее время не используется
name
- название события, строка
ph
- Тип события
Тип | Символ |
---|---|
Начинать | "Б" |
Конец | "Э" |
Полный | "Х" |
tid
— идентификатор потока, u32 pid
— идентификатор процесса, u32
Все tids и pids должны находиться в диапазоне от 0 до u32_MAX, как целые значения.
ts
— метка времени, двойная, в микросекундах dur
— метка времени, двойная, в микросекундах
(Временная метка 1 начинается с 1 мкс)
В настоящее время Spall поддерживает только события начала, окончания и завершения.
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
Для полных событий требуется поле длительности, поскольку они отслеживают начало/окончание функции одновременно.
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
Конечные события автоматически закрывают самое последнее начальное событие с тем же pid и tid, поэтому им не нужны имена.
Независимо от формата приема ожидается, что все начальные и конечные события в процессе/потоке (pid/tid) будут сначала иметь самую раннюю временную метку, отсортированный порядок, например:
[
{"cat":"function", "name":"main", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "name":"foo", "ph": "B", "pid": 0, "tid": 0, "ts": 1},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 2},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 3}
]