Find the LCP element in DevTools or with a PerformanceObserver, then split its time into four parts: time to first byte, resource load delay, resource load duration and element render delay. The largest part tells you what to fix: server, discovery and priority, file size, or render-blocking work.

Key takeaways

  • LCP has four parts. Time to first byte, resource load delay, resource load duration and element render delay, as web.dev describes them.
  • The biggest part is the target. A large load duration means a heavy file; a large load delay means the browser found it late or deprioritised it.
  • Render delay usually means something is blocking paint. In the test below, a slow stylesheet added about 1.2 seconds even though the image arrived on time.
  • Good is 2.5 seconds or less at the 75th percentile. That is a field target, so test on a throttled profile, not your fast laptop.
  • Most pages have one dominant part. In all four cases measured here, a single part made up most of the total.

Finding the element

In Chrome DevTools, Performance panel, record a page load and look for the LCP marker; hovering it names the element. Or paste this into the console and reload with it registered early (a snippet in Sources, or PerformanceObserver with buffered: true):

new PerformanceObserver(list => {
  const e = list.getEntries().pop();
  console.log(e.element, e.url, Math.round(e.renderTime || e.loadTime) + 'ms');
}).observe({ type: 'largest-contentful-paint', buffered: true });

Splitting the time

For an image element, the four parts come from the navigation and resource timing entries:

  • Time to first byte: navigation responseStart.
  • Load delay: image requestStart minus TTFB, the time before the browser even asks for the image.
  • Load duration: image responseEnd minus requestStart.
  • Render delay: LCP time minus image responseEnd.

Four measured cases

Chromium 141, mobile viewport, throttled to 150 ms latency and about 1.6 Mbps, median of three runs per case, on a local server I control.

Times in milliseconds. LCP element was the image in every run.
CaseLCPTTFBLoad delayLoad durationRender delay
Large image, nothing else slow2,93231662,73313
Slow server (1,000 ms to first byte)1,3281,0031130014
Lazy image behind a 1,000 ms stylesheet1,49231,17530014
Eager image, stylesheet takes 1,500 ms1,68821663001,221

Each case has a different winner, and the fix changes with it. The third row is the lazy-loading problem in lazy-loading your hero image: the image was not requested until layout was known, so load delay dominated.

Which part, which fix

Dominant partWhat it meansFixBasis
Time to first byteServer or network is slow before any contentCaching, a closer server, less server work; see slow hostingMeasured
Load delayThe browser found or prioritised the image lateRemove loading="lazy" from it; put it in the HTML; consider fetchpriority="high"Measured and documented
Load durationThe file is too heavy for the connectionResize to the displayed size; use a modern format; compressMeasured
Render delaySomething blocks painting after the image arrivesInline critical CSS or shrink render-blocking CSS and scriptsMeasured

web.dev gives a rough guide for a healthy split, with most of the time in first byte and download and little in the two delays. Treat it as a guide, not a threshold: what matters is that no delay is larger than it needs to be. The two delay parts are the cheapest to fix, because they are about ordering, not bytes. To see how this connects to the report in Search Console, read PageSpeed green, Search Console red.

What this does not cover

These are lab cases on a toy page. The server, image and stylesheet are synthetic, with delays I chose, so the numbers show which part moves with which cause, not typical values. Real pages mix several causes, and text-based LCP elements have no image load parts at all. Throttling emulates a network profile; it is not a real mobile device. I describe the web.dev split only in general terms; check its current article for the exact figures.

Badri Dutta

Software engineer · 8 years technical SEO

Written after measuring four deliberately different slow pages and finding that each one had a different dominant delay. It makes no claim about your site until you measure it.

Full background →