为什么Chrome会花时间从缓存中"下载"内容?

dlr*_*as2 40 google-chrome http-caching google-chrome-devtools

我正在提供旨在由浏览器无限期缓存的静态内容.Chrome正在按预期缓存它,但仍在花时间"下载"它.我使用的是Chrome 46.0.2490.71.

Chrome网络标签

正如您所看到的,内容是从缓存提供的,但内容下载仍需要68毫秒.这导致svg图像在每次页面加载时闪烁,即使文件被缓存.

以下是隐身模式中页面加载的相关时间线信息:

Chrome时间线标签

每个事件的"总时间"和"事件时间"字段为零.使用本地提供的文件(但仍然来自缓存)复制此项,"接收数据"事件只能看一次.

一些有趣的注意事项:

  • 使用相同的编码从本地计算机提供相同的文件不会产生相同的下载延迟.
  • 切换到隐身模式(无扩展名)会使下载延迟减半,但不会消除延迟.
  • 刷新页面更快,因为从服务器接收304响应似乎花费的时间少于仅从缓存加载响应.
  • 关闭开发工具似乎对延迟没有任何影响.
  • IE 11,Edge和Firefox 41没有显示任何延迟.

有什么可能的原因?

Max*_*xML 13

所以这与Chrome中缓存的工作方式有关.我对Chrome的代码库没有个人经验,但我对它的理论有所了解.(我还在这里找到了对Chrome缓存实现的引用,以获得更好奇:chrome disk cache)

作为参考,这是我在Chrome中加载您的实际Stack Overflow问题的屏幕截图,其中Network面板打开,Network Throttling选项设置为"Offline".请注意,此列表中的每个条目都来自缓存!

Imgur screencap

您还会注意到Chrome 正在花时间"下载"每个文件.为什么是这样?好吧,Chrome的缓存是一个数据库,该数据库也被压缩以节省空间.从缓存中检索文档时,检索的价格不为零.Chrome必须在缓存数据库中查找该项目,然后将该条目扩展到内存中,以便Chrome可以使用它.我不知道有关网络chrome-dev-tools面板如何显示时间的具体细节,但我猜想从磁盘获取该文件,解压缩它,然后解析并使用结果就是你所看到的反映在"下载时间"中.

我无法评论为什么其他浏览器也没有这种延迟,因为我没有很多经验.可能是他们要么使用更有效的方法从缓存中获取内容(可能),要么可能是他们始终将缓存保留在内存中(不太可能),或者他们正在跳过一些完整性检查Chrome正在制作缓存数据(可能)

  • 有没有办法优先考虑缓存中内存与磁盘的内容? (4认同)