spall est une bibliothèque de profileurs et une interface Web pour explorer votre code et creuser les problèmes de performances potentiels.
^ il s'agit d'une trace de 180 Mo (équivalent JSON de 526 Mo), de 5 minutes de Happenlance, gracieuseté de @pmttavara !
Essayez-le chez Gravity Moth
spall comprend une petite bibliothèque C à en-tête unique, spall.h
.
spall prend actuellement en charge 2 formats de fichiers différents :
perfetto
, chrome://tracing
et speedscope
, décrit ci-dessous Vous pouvez soit instrumenter votre code avec notre en-tête, soit utiliser votre code de dumping JSON compatible chrome://tracing
existant.
Si vous partez de zéro, vous souhaiterez probablement utiliser l'en-tête Spall pour générer des événements. Le format binaire a une surcharge de profilage bien inférieure (vos traces doivent donc être plus précises) et ingère environ 10 fois plus rapidement que le format JSON.
Si vous souhaitez utiliser JSON, spall attend des événements suivant le format de trace JSON de Google. Ils ressemblent à ceci :
[
{"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 ne se soucie pas des virgules de fin et les crochets fermants ne sont pas nécessaires, pour faciliter la création de fichiers/le streaming d'événements)
cat
- Catégorie d'événement. Actuellement inutilisé
name
- le nom de l'événement, une chaîne
ph
- Le type d'événement
Taper | Symbole |
---|---|
Commencer | "B" |
Fin | "E" |
Complet | "X" |
tid
- identifiant du thread, u32 pid
- identifiant du processus, u32
Tous les tids et pids doivent être compris entre 0 et u32_MAX, sous forme de valeurs entières
ts
- horodatage, un double, en microsecondes dur
- horodatage, un double, en microsecondes
(Un horodatage de 1 commence à 1 μs)
Spall ne prend actuellement en charge que les événements Begin, End et Complete.
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
Les événements complets nécessitent un champ de durée, car ils suivent le début/la fin d'une fonction tout en un.
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
Les événements de fin ferment automatiquement l'événement de début le plus récent avec les mêmes pid et tid, ils n'ont donc pas besoin de noms
Quel que soit le format d'ingestion, tous les événements de début et de fin au sein d'un processus/thread (pid/tid) doivent être triés en premier dans l'horodatage le plus ancien, par exemple :
[
{"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}
]