Image Load Lab

Guides Browser Behaviour Tested Oct 17, 2026 Chrome 155 · 5 cache scenarios

Does Chrome Reuse a Larger srcset Image From Its Cache?

Chrome 155 never downgraded an image on the same page, but a new visit on a narrow screen downloaded the small file although the large one was cached. A reload fetched the small file and still showed the large one.

Responsive images send small screens a small file and large screens a large one. Real visitors do not keep one screen size forever: they rotate phones, resize windows and come back later on another device. When Chrome already has a larger srcset candidate, does it reuse it, and does it ever download a second file for the same image? We ran five scenarios with the HTTP cache switched on.

The test

The page shows one CC0 photo of a carved street sign with four candidates (400, 800, 1200 and 1600 pixels wide; 22.8 KB to 495.4 KB) and sizes="100vw", so the chosen file depends only on the window width. The server sent Cache-Control: public, max-age=31536000, immutable, so every downloaded file stayed in the browser’s cache. Each scenario used a fresh browser profile in Chrome 155.0.8059.82 and was repeated three times:

  • A: load at 1600 pixels, shrink the window to 400, widen it again to 1600.
  • B: load at 400 pixels, then widen to 1600.
  • C: visit at 1600 pixels, close the tab, then open the page in a new 400-pixel tab.
  • D: the reverse of C: first 400 pixels, then a new 1600-pixel tab.
  • E: load at 1600 pixels, shrink to 400 and reload the page.

We logged every image request, its transfer size from Resource Timing, and the file actually displayed (currentSrc). All three runs of every scenario gave identical results. The bench is described on the methodology page.

Results

Bar chart: shrinking a window cost nothing, widening it downloaded the 1600 pixel file, a narrow visit in a new tab downloaded the 400 pixel file although the 1600 pixel one was cached, and a reload downloaded the 400 pixel file but displayed the cached 1600 pixel one
Kilobytes Chrome fetched from the network after the first view in each scenario. Chart generated from the linked CSV.
Same result in all 3 runs of every scenario; file sizes 22.8 KB (400 px) to 495.4 KB (1600 px)
Scenario Requests in order (step: file) File displayed at the end Network bytes after first view
Wide → narrow → wide load at 1600 px: 1600 px 1600 px 0.0 KB
Narrow → wide load at 400 px: 400 px → widen to 1600 px: 1600 px 1600 px 495.4 KB
Wide, then narrow in new tab first visit at 1600 px: 1600 px → second visit at 400 px (new tab): 400 px 400 px 22.8 KB
Narrow, then wide in new tab first visit at 400 px: 400 px → second visit at 1600 px (new tab): 1600 px 1600 px 495.4 KB
Wide, shrink, then reload load at 1600 px: 1600 px → reload at 400 px: 1600 px (from cache, 0 bytes) → reload at 400 px: 400 px 1600 px 22.8 KB

Within one page, Chrome never downgrades. In scenario A the 1600-pixel file stayed on screen after the window shrank to 400 pixels, and no smaller file was requested. Widening again cost nothing either. That is the efficient choice: the larger file is already decoded and looks at least as good.

Within one page, it does upgrade. In scenario B the 400-pixel file was replaced by the 1600-pixel one as soon as the window was widened, at a cost of 495.4 KB. Again, sensible: the small file would look soft in a wide window.

A new visit ignores the larger file in the cache. In scenario C the 1600-pixel file was in the HTTP cache, yet the new 400-pixel tab downloaded the 400-pixel file over the network (22.8 KB). Chrome selected the candidate by screen size, not by what was in its cache, so a cached larger file did not help a later narrow visit.

A reload can do both. Scenario E was the surprise. After the reload at 400 pixels, Chrome downloaded the 400-pixel file over the network (22.8 KB) but displayed the 1600-pixel file, which it took from its cache with a transfer size of zero. The small download was wasted: it happened in all three runs, but the visitor never saw it. We did not trace which part of Chrome issued that request; a likely explanation is the early fetch Chrome starts while parsing the HTML, before the image element finds the larger picture it still holds in memory.

What this means

  • Do not count on the cache to save bytes across visits. A visitor who browses on a wide screen and returns on a narrow one downloads the small version anyway. That is a small cost, because small candidates are small, but the large file in the cache brings no benefit to that later visit.
  • Rotating a phone or resizing a window to a larger layout costs a second download. Offering intermediate candidates (here, 800 and 1200 pixels) keeps that second file smaller, since Chrome picks the smallest one that covers the new width.
  • A reload after shrinking a window wastes a small download. Developers testing responsive pages by resizing and reloading will see an extra request that real visitors rarely trigger.

How Chrome decides which candidate fits a screen is covered in our tests of x and w descriptors and of srcset and sizes.

Practical conclusion

Chrome 155 kept the largest candidate it had shown on a page and upgraded when the window grew, but on a new visit it fetched the candidate for the current screen even when a larger one was already cached. Plan responsive candidates for the size each visit needs, and keep intermediate widths so that upgrades after a resize or rotation stay small.

Limitations

Chrome only, desktop windows resized programmatically rather than phones rotated by hand, and one image with sizes="100vw". Browser cache behaviour can depend on memory pressure and on how long ago the larger file was used; our scenarios ran within seconds.

Data and files

Download srcset-cache.csv (15 rows, 2.5 KB) · Method: testing methodology. Photo: image credits.

Client Hints on Image Requests: What Chrome Sends

Chrome 155 sent DPR, width and network hints with image requests only after Accept-CH, and to another origin only with Permissions-Policy delegation. Width was in device pixels.

Browser Behaviour 4 min read

Video Poster Images and LCP: Same as an img?

A video poster was discovered as early as an img, got the same priority and counted as the LCP element with the same timing, 1,316 ms against 1,320 ms. It cannot use srcset.

Browser Behaviour 3 min read