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}
]