Understanding Inconsistent Performance Metrics in Google PageSpeed Insights: A Deep Dive
Optimizing website performance is an ongoing process that often involves fine-tuning multiple components to achieve the best possible scores across various tools. Recently, I embarked on a journey to enhance my custom frontend, with the ambitious goal of attaining a perfect 4×100 score on both desktop and mobile in Google PageSpeed Insights (PSI). After weeks of iterative improvements—addressing Lighthouse issues, optimizing assets, and refining load strategies—I reached a point where the desktop score is consistently 100/100, and mobile scores hover around 99/100.
However, a perplexing challenge emerged: the PSI performance scores on mobile fluctuate unpredictably within short timeframes. On some tests, scores drop to 79/100 or lower, even though the underlying page source remains unchanged. This inconsistency has caused significant frustration, prompting a detailed investigation into the causes.
Summary of the Issue
-
Stable Lighthouse Results: Using Lighthouse with network throttling set to “Slow 4G” and CPU throttling to “Low-tier mobile,” I consistently achieve perfect 4×100 scores. This indicates the core optimizations are effective and that the baseline performance is solid.
-
Fluctuating PSI Scores: Despite identical page source and cached content, PSI’s “Performance” score on mobile varies significantly—from near-perfect to substantially lower readings—within minutes.
-
Goals and Adjustments: I have implemented extensive performance best practices:
- Inline critical CSS
- Compress HTTP responses
- Preload hero images and fonts
-
Layered JavaScript loading strategies: minimal external loads before
window.load, sequential loading of consent scripts, UI functionality, and deferred functionality after user interaction -
Known Suspects: I suspect the consent management script (CookieYes) and tracking scripts (GA4) influence the loading performance metrics, but the precise impacts are unclear.
Key Observations
- The
window.loadevent fires consistently within approximately 0.5 seconds across tests, suggesting that initial load and visible viewport rendering are stable. - Log timings based on
performance.now()indicate that most lazy-loaded elements complete loading within 1.0 seconds. - The Browse Errors section under “Best Practices” in PSI reveals variations, but the logs are challenging to interpret in conjunction with performance metrics.
- Both tests are performed with cache cleared and using LiteSpeed Cache, ensuring that server-side caching remains consistent between

