spall é uma biblioteca de criação de perfil e um frontend da web para explorar seu código e investigar possíveis problemas de desempenho.
^ este é um rastreamento de 180 MB (equivalente a 526 MB JSON), de 5 minutos do Happenlance, cortesia de @pmttavara!
Experimente no Gravity Moth
spall inclui uma pequena biblioteca C de cabeçalho único, spall.h
.
spall atualmente suporta 2 formatos de arquivo diferentes:
perfetto
, chrome://tracing
e speedscope
, descrito abaixo Você pode instrumentar seu código com nosso cabeçalho ou usar seu código de despejo JSON compatível com chrome://tracing
existente.
Se você está começando do zero, provavelmente desejará usar o cabeçalho spall para gerar eventos. O formato binário tem uma sobrecarga de criação de perfil muito menor (portanto, seus rastreamentos devem ser mais precisos) e ingere cerca de 10 vezes mais rápido que o formato JSON.
Se você quiser usar JSON, o spall espera eventos seguindo o formato de rastreamento JSON do 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 não se importa com vírgulas finais e colchetes não são necessários, para facilitar a criação de arquivos/streaming de eventos)
cat
- Categoria do evento. Atualmente não utilizado
name
- o nome do evento, uma string
ph
- O tipo de evento
Tipo | Símbolo |
---|---|
Começar | "B" |
Fim | "E" |
Completo | "X" |
tid
- id do thread, u32 pid
- id do processo, u32
Todos os tids e pids devem estar entre 0 e u32_MAX, como valores inteiros
ts
- timestamp, um duplo, em microssegundos dur
- timestamp, um duplo, em microssegundos
(Um carimbo de data/hora de 1 começa em 1 μs)
Spall atualmente suporta apenas eventos Begin, End e Complete
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
Eventos completos requerem um campo de duração, porque eles rastreiam o início/fim de uma função em um só lugar
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
Os eventos finais fecham automaticamente o evento inicial mais recente com o mesmo pid e tid, portanto, não precisam de nomes
Independentemente do formato de ingestão, espera-se que todos os eventos de início e fim dentro de um processo/thread (pid/tid) estejam primeiro no carimbo de data/hora mais antigo, na ordem de classificação, por exemplo:
[
{"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}
]