spall はプロファイラー ライブラリであり、コードを探索し、潜在的なパフォーマンスの問題を調査するための Web フロントエンドです。
^ これは、Happenlance からの 180 MB (526 MB JSON に相当)、5 分間のトレースです。@pmttavara の厚意により提供されました。
Gravity Moth で試してみる
spall には、小さな単一ヘッダーの C ライブラリspall.h
が含まれています。
spall は現在 2 つの異なるファイル形式をサポートしています。
perfetto
、 chrome://tracing
、およびspeedscope
で使用される Google のトレース形式)ヘッダーを使用してコードをインストルメントすることも、既存のchrome://tracing
互換の JSON ダンピング コードを使用することもできます。
最初から開始する場合は、おそらく spall ヘッダーを使用してイベントを生成するとよいでしょう。バイナリ形式はプロファイリングのオーバーヘッドがはるかに低く (そのため、トレースはより正確になるはずです)、JSON 形式よりも約 10 倍高速に取り込まれます。
JSON を使用する場合、spall は Google の JSON トレース形式に従うイベントを期待します。イベントは次のようになります。
[
{"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
- イベントのタイプ
タイプ | シンボル |
---|---|
始める | 「B」 |
終わり | 「え」 |
完了 | 「×」 |
tid
- スレッド ID、u32 pid
- プロセス ID、u32
すべての tid と pid は、整数値として 0 から u32_MAX までの範囲にある必要があります。
ts
- タイムスタンプ、倍精度、マイクロ秒単位dur
- タイムスタンプ、倍精度、マイクロ秒単位
(タイムスタンプ 1 は 1 μs から始まります)
Spall は現在、Begin、End、および Complete イベントのみをサポートしています
{"cat":"function", "name":"foo", "ph": "X", "pid": 0, "tid": 0, "ts": 0, "dur": 1},
完了イベントは関数の開始/終了をすべて 1 つで追跡するため、期間フィールドが必要です。
{"cat":"function", "name":"myfunction", "ph": "B", "pid": 0, "tid": 0, "ts": 0},
{"cat":"function", "ph": "E", "pid": 0, "tid": 0, "ts": 0},
End イベントは同じ pid と tid を持つ最新の begin イベントを自動的に閉じるため、名前は必要ありません。
取り込み形式に関係なく、プロセス/スレッド (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}
]