W3C Web Performance Workingの議事録に「JS Self-Profiling API」についての議論があったので簡単に眺めておく。
ミーティングの「発表スライドはこちら」
JS Self-Profiling API
いわゆるRUM(Real user monitoring)などと同様、実際のユーザ側でJavaScriptのプロファイルを取得可能にするというのが「JS Self-Profiling API」のようだ。
ユーザにより端末やネットワーク環境が違うため、実際のユーザ側でJavaScriptのプロファイルを取りたい。timerを使うことで擬似的に測定はできるが、コード量やオーバヘッドが増える。この提案を行っている、Facebookの人らはJavaScriptとSharedArrayBuffersでサンプリングプロファイラを実装したが正確性とパフォーマンスの欠点があると述べています。
といった背景から、このような提案が出ているようだ。
使い方
プロファイルを取るサンプルコードが出ている。
performance.profileでプロファイリングを開始して、stopして得られた結果を送信するような流れである。
const profiler = performance.profile({ categories: ['js'], sampleInterval: 10 }); for (let i = 0; i < 1000000; i++) { await doWork(); } const trace = await profiler.stop(); sendTrace(trace);
profileデータ
得られたデータのフォーマットは、V8のTrace Event FormatやGecko profile formatを参考に作られているようだ。
interface ProfilerTrace { readonly attribute FrozenArray<ProfilerFrame> frames; readonly attribute FrozenArray<ProfilerStack> stacks; readonly attribute FrozenArray<ProfilerSample> samples; [Default] object toJSON(); };
framesから実行状態を取れる模様