v145 · Performance
LoAF Presentation Inspector
Long Animation Frame (LoAF) entries now carry presentationTime in Chrome 145. Each janky frame tells you not just when JS ran, but exactly when the resulting pixels reached the screen. This demo deliberately creates long frames and shows the full phase breakdown: script → render → paint → present.
Feature detection: checking…
Stress controls — trigger long frames
Statistics
Total LoAF frames
0
Avg LoAF duration
—
Avg compositor lag
—
Max presentation lag
—
Long Animation Frames
Script
Render
Paint
Compositor
| # | Duration | renderStart | paintTime | presentationTime | Compositor lag | Phase breakdown |
|---|---|---|---|---|---|---|
| No LoAF entries yet — trigger a burst above | ||||||
// LoAF entries now carry presentationTime in Chrome 145
const obs = new PerformanceObserver(list => {
for (const entry of list.getEntries()) {
if (entry.entryType !== 'long-animation-frame') continue;
const compositorLag = entry.presentationTime - (entry.renderStart + entry.styleAndLayoutDuration);
const paintLag = entry.paintTime ? entry.paintTime - entry.renderStart : null;
console.log({
duration: entry.duration, // total frame time ≥ 50 ms
renderStart: entry.renderStart, // layout/paint start
paintTime: entry.paintTime, // CPU rasterisation done (Chrome 145+)
presentationTime: entry.presentationTime, // frame on screen (Chrome 145+)
compositorLag, // how long compositor held the frame
});
}
});
obs.observe({ type: 'long-animation-frame', buffered: true });
see also
- Compositor Latency Inspector — LCP phase bars
- Frame Timeline — stacked waterfall of phases
- RUM Beacon Builder — aggregate stats for analytics
- ChromeStatus entry