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

46
我正在提供旨在由浏览器无限期缓存的静态内容。 Chrome正在按预期进行缓存,但仍花费时间“下载”它。 我正在使用Chrome 46.0.2490.71。

Chrome Network Tab

如您所见,内容正在从缓存中提供,但仍需要 68 毫秒进行内容下载。这导致 svg 图像在每个页面加载时闪烁,即使文件已被缓存。
以下是隐身模式下页面加载的相关时间轴信息:

Chrome Timeline Tab

针对每个事件,“总时间”和“事件时间”字段均为零。使用本地服务器(但仍从缓存中获取文件)进行复制,“接收数据”事件仅出现一次。
需要注意的几点:
  • 使用相同编码从我的本地机器提供相同文件,不会产生相同的下载延迟。
  • 切换到无痕模式(没有扩展程序)可以将下载延迟减少一半,但不能消除它。
  • 刷新页面更快,因为似乎从服务器接收304响应比仅从缓存加载花费的时间更少。
  • 关闭开发工具对延迟似乎没有影响。
  • IE11、Edge和Firefox41没有显示任何延迟。
有哪些可能的原因?

你加载了哪些扩展?大多数扩展在隐身模式下无法使用... - malix
1
这可能是由您安装的扩展程序引起的。很多时候,它们会导致像这样奇怪的错误,因为它们可以访问代码/浏览器中的许多内容...我从未遇到过这种情况,而且我一直使用开发工具来衡量我的网站性能,所以我不认为这是Chrome的错误。只需尝试禁用它们,然后逐个启用它们即可。 - gillyb
1
说实话,我认为从磁盘加载142kb需要67ms并不是不现实的。 - ՕլՁՅԿ
我也遇到了同样的问题,但是没有一个答案能够解释它:Google Chrome,url: https://d301sr5gafysq2.cloudfront.net/6533ea311688/dist/webpack/vendor.js,大小:10MB。第一次下载需要很长时间(23秒-100+秒),这不是我的问题。但是即使它得到了HTTP响应代码304,并且实际下载大小为408字节,刷新也需要2-3秒,其中大部分是内容下载。然而,如果我将文件下载并作为file:///tmp/vendor.js打开,则加载时间为15-50ms。 - Gavriel
5个回答

15

这与Chrome中缓存的工作方式有关。我没有个人在Chrome代码库上的经验,但我了解它的理论知识。(对于更好奇的人,我在这里找到了一个关于Chrome缓存实现的参考:Chromium磁盘缓存)

供参考,这是在Chrome中使用“网络”面板并将网络限制设置为“离线”时加载您在Stack Overflow上的实际问题的屏幕截图。请注意,此列表中的每个条目都来自缓存!

Imgur screencap

您还会注意到,Chrome确实花费时间“下载”每个文件。为什么会这样呢?因为Chrome的缓存是一个数据库,而该数据库也被压缩以节省空间。当您从缓存中检索文档时,该检索的代价并不为零。Chrome必须在缓存数据库中查找项目,然后将该条目展开到内存中,以便Chrome可以处理它。我不知道有关网络chrome-dev-tools面板如何显示时间的确切细节,但我猜测从磁盘获取文件,解压缩文件,然后解析和处理结果是您在“时间下载”中看到的。

我无法评论其他浏览器为什么没有这种延迟,因为我没有太多的经验。可能是它们使用了更有效的从缓存中获取东西的方法,或者它们始终将缓存保存在内存中(不太可能),或者它们跳过了Chrome对缓存数据进行的某些完整性检查(可能)。


4
在缓存中,是否有一种方法可以优先考虑将什么内容放入内存而非磁盘? - Skylervich

2
我遇到了同样的问题。我实现了PDF下载功能。当我点击下载链接时,我在大约260毫秒内得到响应,但是在Chrome上下载需要10秒钟才开始。
解决方法:我分析发现我的Windows系统是64位的,而Chrome是32位的。升级Chrome到64位后,这个问题就解决了。 我在https://bugs.chromium.org/p/chromium/issues/detail?id=103737找到了解决方案。

0

我遇到了类似的“问题”。然而,一旦我在关闭 DevTools 的情况下在隐身窗口中加载我的页面(带有“从磁盘缓存中慢速检索”的依赖项),意外的延迟就消失了。这让我想到,问题可能是由于 Chrome 扩展或 DevTools 窗口的干扰造成的。


0

我也遇到了同样的问题,从缓存中下载需要很长时间。 问题在于我的文件gzip大小为410 KB(已经很大了) 解压后大小为1.5 MB,因此浏览器用了很长时间从缓存中加载并解压它。

使用最新的Chrome开发工具,您还可以看到解压后的大小: 使用最新的Chrome开发工具,您还可以看到解压后的大小


0

当我传递header("Content-Length: xxx")时,加载速度快了100%!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接