Every performance conversation starts with a score out of a hundred, produced by a tool running on a simulated device with a simulated connection. It is a useful number. It is not a measurement of anything a customer has ever experienced.
The gap
We keep a shelf of old phones for exactly this. A mid-range Android from four years ago, throttled to the kind of connection you get in a basement car park, is the closest thing we have to an honest test.
The lab said 94. The car park said eleven seconds to first meaningful paint, most of it spent parsing JavaScript that existed to animate a number counting up.
What usually causes it
- Fonts loaded before anything is allowed to render
- A hero image sized for a 5K display and shipped to a 360px screen
- Analytics and tag managers in the critical path
- A framework doing client-side work the server could have done once
None of that is exotic. All of it is invisible on a fast machine.
The fix is usually deletion
Almost every performance win we have shipped was something removed rather than something optimised. That is an unsatisfying answer for a proposal and a very good one for a customer standing in a car park.
The lab said 94. The car park said eleven seconds to first meaningful paint.