spall ist eine Profiler-Bibliothek und ein Web-Frontend zur Erkundung Ihres Codes und zur Untersuchung potenzieller Leistungsprobleme.
^ Dies ist ein 180 MB (526 MB JSON-Äquivalent), 5-Minuten-Trace von Happenlance, mit freundlicher Genehmigung von @pmttavara!
Probieren Sie es bei Gravity Moth aus
spall enthält eine kleine Single-Header-C-Bibliothek, spall.h
.
spall unterstützt derzeit zwei verschiedene Dateiformate:
perfetto
, chrome://tracing
und speedscope
verwendet wird (siehe unten). Sie können Ihren Code entweder mit unserem Header instrumentieren oder Ihren vorhandenen chrome://tracing
kompatiblen JSON-Dumping-Code verwenden.
Wenn Sie bei Null anfangen, möchten Sie wahrscheinlich den Spall-Header zum Generieren von Ereignissen verwenden. Das Binärformat hat einen viel geringeren Profilierungsaufwand (daher sollten Ihre Traces genauer sein) und nimmt etwa zehnmal schneller auf als das JSON-Format.
Wenn Sie JSON verwenden möchten, erwartet spall Ereignisse, die dem JSON-Trace-Format von Google folgen. Sie sehen so aus:
[
{"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 kümmert sich nicht um abschließende Kommas und es sind keine schließenden Klammern erforderlich, um die Dateierstellung/das Ereignis-Streaming zu vereinfachen.)
cat
– Kategorie des Ereignisses. Derzeit unbenutzt
name
– der Name des Ereignisses, eine Zeichenfolge
ph
– Die Art des Ereignisses
Typ | Symbol |
---|---|
Beginnen | "B" |
Ende | „E“ |
Vollständig | "X" |
tid
– Thread-ID, u32 pid
– Prozess-ID, u32
Alle TIDs und PIDs müssen als ganze Werte zwischen 0 und u32_MAX liegen
ts
– Zeitstempel, ein Double, in Mikrosekunden dur
– Zeitstempel, ein Double, in Mikrosekunden
(Ein Zeitstempel von 1 beginnt bei 1 μs)
Spall unterstützt derzeit nur die Ereignisse „Begin“, „End“ und „Complete“.
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
Für vollständige Ereignisse ist ein Dauerfeld erforderlich, da sie den Start/das Ende einer Funktion in einem erfassen
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
Endereignisse schließen automatisch das letzte Anfangsereignis mit derselben PID und TID, sodass sie keine Namen benötigen
Unabhängig vom Aufnahmeformat wird erwartet, dass alle Anfangs- und Endereignisse innerhalb eines Prozesses/Threads (PID/TID) in der Reihenfolge des frühesten Zeitstempels zuerst vorliegen, z. B.:
[
{"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}
]