What is actually in the report

The performance section of a PageSpeed report is a list, and a list arriving in order reads as a priority order. Here is what that list contains across 440 audited sites, counted by how often each named hint appears with a saving attached.

HintSitesShare
unused-javascript41093%
unused-css-rules37786%
bootup-time34478%
mainthread-work-breakdown34278%
long-tasks34278%
render-blocking-insight33376%
layout-shifts23754%
cache-insight21549%
image-delivery-insight20647%
font-display-insight16838%
legacy-javascript-insight12929%
unminified-javascript11727%
unminified-css9421%
server-response-time5913%
redirects307%

The median report carries eight of these. Two observations follow from the shape of the table rather than from any single row.

Eight hints, fewer than eight problems

bootup-time, mainthread-work-breakdown and long-tasks appear on 78%, 78% and 78% of sites, and the near-identical shares are not a coincidence. They are three measurements of the same thing: JavaScript occupying the main thread. Add unused-javascript and legacy-javascript-insight and a site that ships one oversized bundle collects five of its eight hints from a single cause.

This is not a flaw in the tool. Each of those audits answers a different question and each is useful when you are looking at that question. It is a flaw in reading the list as a to-do list, which is what a numbered list of eight items invites. Google’s own note on the reorganisation of these audits says the direction of travel is the opposite: in some cases advice from many audits is consolidated into a single insight.

The top of the list is the part nobody outside the code can take

The two most common entries, on 93% and 86% of sites, are unused JavaScript and unused CSS. Both are answered the same way: rebuild the site’s bundles so they ship less. That requires the source, the build, and the ability to test what breaks.

The condition Lighthouse checks is documented plainly: Lighthouse flags every JavaScript file with more than 20 kibibytes of unused code. A file counts if any 20 KiB of it went unexecuted during one load. A component library that loads a date picker the visitor did not open on this particular page satisfies that, and so does a genuinely bloated bundle, and the report shows the same line for both.

We are on the outside of the code as well, and we make no attempt at either one. Nothing our proxy does removes a byte of unused JavaScript from a site’s bundle, and we do not rewrite CSS files to drop rules the page did not use. When the top two items on nine reports out of ten are items we do not touch, that is worth writing down rather than working around.

What was available to change on the same 440 sites

The same audits carry our change log. Each line records a component that rewrote something in the page, so the share below is the share of those 440 sites where the component found something to do.

What was changedSitesShare
Scripts given a defer or a later moment to run31271%
Stylesheets moved out of the blocking path28966%
Small stylesheets inlined instead of fetched27162%
First-screen image and logo given priority26661%
Off-screen sections marked skippable for layout26560%
Resource hints that pointed nowhere useful removed25658%
Images given a declared aspect ratio24957%
Body scripts moved to a later load23954%
Third-party widgets deferred21148%
Fonts inlined into the document17941%
CSS background of the first screen preloaded17540%
Critical CSS extracted9421%
font-display added to declarations in the markup9221%

Nothing in that column removes code from the site. Every line is about when and in what order the browser is told about something that was going to load anyway. That is the entire class of change available to anyone who cannot edit the source, and it maps onto exactly one of the top six report entries: render-blocking requests, at 76%.

The two lists answer two different questions

Lighthouse sorts by what it can measure. Everything on its list is a condition observable from one instrumented page load, and the conditions that are easiest to observe — bytes shipped and not executed, milliseconds of script — sit at the top because they are the most measurable, not because they are the most available.

A fix list sorts by what can be changed, and for anyone who is not the site’s developer that is a much shorter list: order, priority, timing, headers. The two lists overlap in the middle and diverge at both ends. That is the answer to the question this study opened with, and it is not a criticism of either list.

It does have a practical consequence, and it is the reason the report frustrates people who follow it. If your site sits at 40 and your report opens with unused JavaScript, then either the work is in your build system or it is not going to happen. Nothing you install in front of the site addresses that line, ours included. What the outside layer can address is the sixth line down, and how much that is worth depends entirely on the page: on 76% of these sites, the browser is being told about the render-blocking work before it is told about the image the visitor came to see.

What we would check first

Not in the report’s order, and not in ours either.

Look at whether the top hint is repeating itself. If unused JavaScript, bootup time, main-thread work and long tasks are all present, that is one finding with four labels, and the first question is what the scripts are, not which of the four to open.

Read the saving, not the presence. The insight entries report estimated milliseconds per metric. A hint present with 30 ms attached and a hint present with 1,200 ms attached occupy the same amount of space in the report and are not the same news.

Separate what needs the source from what does not. It is a short exercise and it usually splits an eight-item report into two lists of three and five. Everything in the first list is a scheduling decision for your team; everything in the second can be done at the edge, by you or by anyone else.

Method and limits

On 2026-08-24 we read the stored PageSpeed response of every audit in our base and kept the mobile measurement of the site as it is, before any of our own changes. 446 audits had that measurement and 440 carried at least one hint. We counted, for each named hint, the number of sites where it appears with a reported saving, and the number of hints per site. Against that we set our own change logs for the same audits: each log line names the component that rewrote something in the page, so we counted the share of the same 440 sites where each one found something to change. Both columns are counts of presence over one population, not a matched comparison — see the caveats.

Measured on 24 Aug 2026 across 440 sites. These figures are frozen at that date — we don't quietly restate a published study when the audit base grows.

What this doesn't show

  • Not a random sample of the web. These are 440 sites we chose to audit, weighted toward sites someone already suspected were slow, plus several platform batches. Read every figure as "of these 440".
  • A hint being present means Lighthouse found the condition it looks for, not that the page has a problem worth someone's afternoon. Unused JavaScript, for instance, is flagged on every file carrying more than 20 KiB of unused code, which is a threshold on a file rather than a judgement about the page.
  • Our change log records what we changed, not what was wrong. A component that never fires can mean there was nothing to do, or that it does not look where the problem is. The font display figures are the clearest example of the second kind: our rewriting only reaches declarations visible in the markup, so sites that declare fonts inside an external stylesheet are counted as nothing-to-do when they are in fact not-inspected.
  • The two columns are not a before/after and cannot be subtracted. Lighthouse counts conditions on the page; we count interventions we made. They are set side by side to compare what the two lists are ABOUT, and that is the only reading they support.
  • 19 of the 440 records (4%) were still written by our previous, narrower reading of the PageSpeed response, which discarded hints packaged in a way it did not recognise. Every figure for a hint under its new name is therefore a floor, understated by up to those 4%.
  • We do not verify the savings Lighthouse estimates. The estimates come from one throttled load, and this study counts whether a hint is present, never whether its number is right.

Sources

  1. Reduce unused JavaScript — Chrome for Developers
    Lighthouse flags every JavaScript file with more than 20 kibibytes of unused code
  2. Lighthouse is moving to performance insight audits — Chrome for Developers
    in some cases advice from many audits is consolidated into a single insight
  3. About PageSpeed Insights — Google for Developers
    Any green score (90+) is considered good, but note that having good lab data does not necessarily mean real-user experiences will also be good.