spall es una biblioteca de creación de perfiles y una interfaz web para explorar su código e investigar posibles problemas de rendimiento.
^ ¡Este es un seguimiento de 5 minutos de 180 MB (equivalente a JSON de 526 MB) de Happenlance, cortesía de @pmttavara!
Pruébalo de nuevo en Gravity Moth
spall incluye una pequeña biblioteca C de un solo encabezado, spall.h
.
spall actualmente admite 2 formatos de archivo diferentes:
perfetto
, chrome://tracing
y speedscope
, que se describe a continuación Puede instrumentar su código con nuestro encabezado o utilizar su código de volcado JSON compatible chrome://tracing
existente.
Si está empezando desde cero, probablemente desee utilizar el encabezado fragmentado para generar eventos. El formato binario tiene una sobrecarga de creación de perfiles mucho menor (por lo que sus seguimientos deberían ser más precisos) y se ingiere aproximadamente 10 veces más rápido que el formato JSON.
Si desea utilizar JSON, spall espera eventos que sigan el formato de seguimiento JSON de Google. Se ven así:
[
{"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}
]
(A Spall no le importan las comas finales y no se requieren corchetes para facilitar la creación de archivos/transmisión de eventos)
cat
- Categoría del evento. Actualmente sin uso
name
: el nombre del evento, una cadena
ph
- El tipo de evento
Tipo | Símbolo |
---|---|
Comenzar | "B" |
Fin | "MI" |
Completo | "INCÓGNITA" |
tid
- ID del hilo, u32 pid
- ID del proceso, u32
Todos los tids y pids deben estar entre 0 y u32_MAX, como valores completos
ts
- marca de tiempo, un doble, en microsegundos dur
- marca de tiempo, un doble, en microsegundos
(Una marca de tiempo de 1 comienza en 1 μs)
Actualmente, Spall solo admite eventos de inicio, fin y finalización.
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
Los eventos completos requieren un campo de duración, porque rastrean el inicio/final de una función, todo en uno
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
Los eventos de finalización cierran automáticamente el evento de inicio más reciente con el mismo pid y tid, por lo que no necesitan nombres
Independientemente del formato de ingesta, se espera que todos los eventos de inicio y fin dentro de un proceso/subproceso (pid/tid) estén primero en la marca de tiempo más temprana, en orden, por ejemplo:
[
{"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}
]