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.
The typical page weighs 2.3 MB across 71 requests.
Distribution & median CLS site count and median CLS at each level of page weight & requests — n
Passing CLS by page weight & requests — n which level passes the CLS most often
Page weight & requests — n 71. p75 120. p99 439. At the low end (20–29): CLS 0.00. At the high end (200+): CLS 0.00. computed
Distribution & median CLS site count and median CLS at each level of page weight & requests — size
Passing CLS by page weight & requests — size which level passes the CLS most often
Page weight & requests — size 2.3 MB. p75 4.5 MB. p99 33.3 MB. At the low end (0–499 KB): CLS 0.00. At the high end (9500+ KB): CLS 0.00. 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.
Chrome field data from 189,915 sites, representing millions of real page loads. How we measured.
Live queries (4) — 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."phone".cls, 0.5) AS median,
COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL AND crux."phone".cls <= 0.1) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".cls 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;
SELECT CASE WHEN m.network.total.size >= 0 AND m.network.total.size < 500 THEN 0 WHEN m.network.total.size >= 500 AND m.network.total.size < 1000 THEN 1 WHEN m.network.total.size >= 1000 AND m.network.total.size < 1500 THEN 2 WHEN m.network.total.size >= 1500 AND m.network.total.size < 2000 THEN 3 WHEN m.network.total.size >= 2000 AND m.network.total.size < 2500 THEN 4 WHEN m.network.total.size >= 2500 AND m.network.total.size < 3000 THEN 5 WHEN m.network.total.size >= 3000 AND m.network.total.size < 3500 THEN 6 WHEN m.network.total.size >= 3500 AND m.network.total.size < 4000 THEN 7 WHEN m.network.total.size >= 4000 AND m.network.total.size < 4500 THEN 8 WHEN m.network.total.size >= 4500 AND m.network.total.size < 5000 THEN 9 WHEN m.network.total.size >= 5000 AND m.network.total.size < 5500 THEN 10 WHEN m.network.total.size >= 5500 AND m.network.total.size < 6000 THEN 11 WHEN m.network.total.size >= 6000 AND m.network.total.size < 6500 THEN 12 WHEN m.network.total.size >= 6500 AND m.network.total.size < 7000 THEN 13 WHEN m.network.total.size >= 7000 AND m.network.total.size < 7500 THEN 14 WHEN m.network.total.size >= 7500 AND m.network.total.size < 8000 THEN 15 WHEN m.network.total.size >= 8000 AND m.network.total.size < 8500 THEN 16 WHEN m.network.total.size >= 8500 AND m.network.total.size < 9000 THEN 17 WHEN m.network.total.size >= 9000 AND m.network.total.size < 9500 THEN 18 WHEN m.network.total.size >= 9500 THEN 19 END AS bucket_idx, COUNT(*) AS n,
quantile_disc(crux."phone".cls, 0.5) AS median,
COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL AND crux."phone".cls <= 0.1) * 1.0 / NULLIF(COUNT(*) FILTER (WHERE crux."phone".cls IS NOT NULL), 0) AS good_pct
FROM sites WHERE m.network.total.size IS NOT NULL GROUP BY bucket_idx;