Page weight & requests
Every request the page makes on a cold load: request count and total transfer size over the wire.
At a glance the headline numbers for Page weight & requests
Every request the page makes on a cold load: request count and total transfer size over the wire.
Distribution & median LCP site count and median LCP at each level of page weight & requests — n
Passing LCP by page weight & requests — n which level passes the LCP most often
Page weight & requests — n 71. p75 120. p99 439. At the low end (20–29): LCP 1.2s. At the high end (200+): LCP 1.7s. computed
Why this matters for the Core Web Vitals, and where to start fixing it
Page weight is a bandwidth problem. The network can only move so many bytes per second and every resource on the page competes for that capacity. The LCP image does not load alone. It shares bandwidth with every script, stylesheet and tracking pixel that loads at the same time. A heavier page means the main content arrives later.
Request count matters next to the bytes. Every request adds queueing and scheduling overhead. On a busy connection important requests wait behind unimportant ones. Script bytes keep costing after the download. The main thread has to parse and execute them, and that delays interactions (INP). The resource type breakdown shows where the bytes sit.
How does page weight affect the Core Web Vitals?
Page weight & requests correlate with the LCP. Where the request count is low, 88% of sites pass the LCP. Where it is high, 78% do. The decline is gradual. There is no point where sites suddenly start failing.
Chrome field data from 189,915 sites, representing millions of real page loads. How we measured.
Live queries (3) — admin only
SELECT COUNT(*) AS count,
quantile_disc(m.network.total.n, 0.10) AS p10,
quantile_disc(m.network.total.n, 0.25) AS p25,
quantile_disc(m.network.total.n, 0.50) AS p50,
quantile_disc(m.network.total.n, 0.75) AS p75,
quantile_disc(m.network.total.n, 0.90) AS p90,
quantile_disc(m.network.total.n, 0.99) AS p99
FROM sites WHERE m.network.total.n IS NOT NULL;
SELECT CASE WHEN m.network.total.n >= 20 AND m.network.total.n < 30 THEN 0 WHEN m.network.total.n >= 30 AND m.network.total.n < 40 THEN 1 WHEN m.network.total.n >= 40 AND m.network.total.n < 50 THEN 2 WHEN m.network.total.n >= 50 AND m.network.total.n < 60 THEN 3 WHEN m.network.total.n >= 60 AND m.network.total.n < 70 THEN 4 WHEN m.network.total.n >= 70 AND m.network.total.n < 80 THEN 5 WHEN m.network.total.n >= 80 AND m.network.total.n < 90 THEN 6 WHEN m.network.total.n >= 90 AND m.network.total.n < 100 THEN 7 WHEN m.network.total.n >= 100 AND m.network.total.n < 110 THEN 8 WHEN m.network.total.n >= 110 AND m.network.total.n < 120 THEN 9 WHEN m.network.total.n >= 120 AND m.network.total.n < 130 THEN 10 WHEN m.network.total.n >= 130 AND m.network.total.n < 140 THEN 11 WHEN m.network.total.n >= 140 AND m.network.total.n < 150 THEN 12 WHEN m.network.total.n >= 150 AND m.network.total.n < 160 THEN 13 WHEN m.network.total.n >= 160 AND m.network.total.n < 170 THEN 14 WHEN m.network.total.n >= 170 AND m.network.total.n < 180 THEN 15 WHEN m.network.total.n >= 180 AND m.network.total.n < 190 THEN 16 WHEN m.network.total.n >= 190 AND m.network.total.n < 200 THEN 17 WHEN m.network.total.n >= 200 THEN 18 END AS bucket_idx, COUNT(*) AS n,
quantile_disc(crux."all".lcp, 0.5) AS median,
COUNT(*) FILTER (WHERE crux."all".lcp IS NOT NULL AND crux."all".lcp <= 2500) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."all".lcp IS NOT NULL), 0) AS good_pct
FROM sites WHERE m.network.total.n IS NOT NULL GROUP BY bucket_idx;
SELECT COUNT(*) AS count,
quantile_disc(m.network.total.size, 0.10) AS p10,
quantile_disc(m.network.total.size, 0.25) AS p25,
quantile_disc(m.network.total.size, 0.50) AS p50,
quantile_disc(m.network.total.size, 0.75) AS p75,
quantile_disc(m.network.total.size, 0.90) AS p90,
quantile_disc(m.network.total.size, 0.99) AS p99
FROM sites WHERE m.network.total.size IS NOT NULL;