以下是隐身模式下页面加载的相关时间轴信息: 针对每个事件,“总时间”和“事件时间”字段均为零。使用本地服务器(但仍从缓存中获取文件)进行复制,“接收数据”事件仅出现一次。
需要注意的几点:
- 使用相同编码从我的本地机器提供相同文件,不会产生相同的下载延迟。
- 切换到无痕模式(没有扩展程序)可以将下载延迟减少一半,但不能消除它。
- 刷新页面更快,因为似乎从服务器接收304响应比仅从缓存加载花费的时间更少。
- 关闭开发工具对延迟似乎没有影响。
- IE11、Edge和Firefox41没有显示任何延迟。
这与Chrome中缓存的工作方式有关。我没有个人在Chrome代码库上的经验,但我了解它的理论知识。(对于更好奇的人,我在这里找到了一个关于Chrome缓存实现的参考:Chromium磁盘缓存)
供参考,这是在Chrome中使用“网络”面板并将网络限制设置为“离线”时加载您在Stack Overflow上的实际问题的屏幕截图。请注意,此列表中的每个条目都来自缓存!
您还会注意到,Chrome确实花费时间“下载”每个文件。为什么会这样呢?因为Chrome的缓存是一个数据库,而该数据库也被压缩以节省空间。当您从缓存中检索文档时,该检索的代价并不为零。Chrome必须在缓存数据库中查找项目,然后将该条目展开到内存中,以便Chrome可以处理它。我不知道有关网络chrome-dev-tools面板如何显示时间的确切细节,但我猜测从磁盘获取文件,解压缩文件,然后解析和处理结果是您在“时间下载”中看到的。
我无法评论其他浏览器为什么没有这种延迟,因为我没有太多的经验。可能是它们使用了更有效的从缓存中获取东西的方法,或者它们始终将缓存保存在内存中(不太可能),或者它们跳过了Chrome对缓存数据进行的某些完整性检查(可能)。
我遇到了类似的“问题”。然而,一旦我在关闭 DevTools 的情况下在隐身窗口中加载我的页面(带有“从磁盘缓存中慢速检索”的依赖项),意外的延迟就消失了。这让我想到,问题可能是由于 Chrome 扩展或 DevTools 窗口的干扰造成的。
当我传递header("Content-Length: xxx")时,加载速度快了100%!