Check: DNS resolution time
dig example.com | grep 'Query time'
β Fast (<50ms typical) β Slow
Action: Use faster resolvers, reduce TTL churn, enable DNS prefetch, geo DNS or anycast NS closer to users
Fast β
Check: TLS handshake duration
curl -w 'tls:%{time_appconnect}\n' -o /dev/null -s https://example.com
β OK β High
Action: Session tickets, OCSP stapling, HTTP/2 or QUIC, reduce cert chain size, edge TLS termination at CDN
OK β
Check: Time to first byte (TTFB)
curl -w 'ttfb:%{time_starttransfer} total:%{time_total}\n' -o /dev/null -s https://example.com
β Low TTFB β High TTFB
Action: Origin CPU/DB/cache, cold containers, region latency, add caching, scale app, optimize queries, move origin closer
Good β
Check: Download size & compression
curl -sI https://example.com | grep -i content-length
curl -sI -H 'Accept-Encoding: gzip' https://example.com | grep -i content-encoding
β Reasonable β Huge / uncompressed
Action: Enable gzip/Brotli, shrink images, code-split JS, lazy-load media, HTTP/2 multiplexing
OK β
Check: Is a CDN caching static assets?
curl -sI https://example.com/static/app.js | grep -iE 'cf-cache|x-cache|age|server'
β HIT / edge β MISS / direct origin
Action: Put static on CDN, tune cache headers (Cache-Control), purge stale objects, enable image CDN
Optimized β
Check: Client-side render & third parties
(Chrome DevTools β Network β Disable cache β reload, check waterfall)
β Clean β Blocking scripts
Action: Defer/async scripts, cut trackers, preconnect to critical origins, reduce main-thread work
β
Youβve isolated the slow phase, apply the matching optimization above and re-measure with WebPageTest or Lighthouse