优化文件缓存和 HTTP2

2024-02-01

我们的网站正在考虑切换到 http2。

我的理解是http2 使文件连接等优化技术变得过时,因为使用 http2 的服务器只发送一个请求。

相反,我看到的建议是最好保持文件大小较小以便它们更有可能被浏览器缓存。

这可能取决于网站的大小,但是如果网站使用 http2 并且希望专注于缓存,那么网站的文件应该有多小?

在我们的例子中,我们的许多单独的 js 和 css 文件都在 1kb 到 180kb 范围内。 Jquery 和 bootstrap 可能更多。累积起来,我们网站上新下载的页面通常小于 900 kb。

所以我有两个问题:

这些文件大小是否足够小,可以被浏览器缓存?

如果它们小到足以被缓存,那么对于使用不支持 http2 的浏览器的用户来说,串联文件是否有好处?

在这种情况下使用更大的文件并使用 HTTP2 会不会有什么坏处?这样,运行任一协议的用户都会受益,因为站点可以针对 http 和 http2 进行优化。


让我们澄清一些事情:

我的理解是,http2 使文件连接等优化技术变得过时,因为使用 http2 的服务器只发送一个请求。

HTTP/2 呈现文件串联等优化技术somewhat已过时,因为 HTTP/2 允许通过同一连接并行下载许多文件。以前,在 HTTP/1.1 中,浏览器可以请求一个文件,然后必须等到该文件完全下载后才能请求下一个文件。这导致了诸如文件串联(以减少所需文件数量)和多个连接(允许并行下载的黑客)等变通办法。

然而,有一个反驳的观点认为,多个文件仍然存在开销,包括请求它们、缓存它们、从缓存中读取它们……等等。HTTP/2 中的开销大大减少,但并没有完全消失。此外,gzip 压缩文本文件对于较大的文件比单独 gzip 压缩许多较小的文件效果更好。但就我个人而言,我认为缺点大于这些担忧,并且我认为一旦 HTTP/2 无处不在,串联就会消失。

相反,我看到的建议是,最好保持文件大小较小,以便浏览器更有可能缓存它们。

这可能取决于网站的大小,但是如果网站使用 http2 并且希望专注于缓存,那么网站的文件应该有多小?

文件大小与是否会被缓存无关(除非我们谈论的是比缓存本身更大的真正海量文件)。将文件分割成较小的块更有利于缓存的原因是,如果您进行任何更改,则仍然可以从缓存中使用任何未触及的文件。如果您将所有 javascript(例如)放在一个大 .js 文件中,并且更改了一行代码,则需要再次下载整个文件 - 即使它已经在缓存中。

同样,如果您有一个图像精灵图,那么这对于减少 HTTP/1.1 中的单独图像下载非常有用,但如果您需要编辑它以添加一个额外的图像,则需要再次下载整个精灵文件。更不用说whole下载东西 - 即使对于仅使用这些图像精灵之一的页面也是如此。

然而,尽管如此,有一种观点认为长期缓存的好处被夸大了。看本文 http://www.nateberkopec.com/2015/11/05/page-weight-doesnt-matter.html特别是关于 HTTP 缓存的部分,它表明大多数人的浏览器缓存比您想象的要小,因此您的资源不太可能被缓存很长时间。这并不是说缓存不重要,而是说它对于在该会话中而不是长期浏览非常有用。因此,每次访问您的网站都可能会再次下载您的所有文件 - 除非他们是非常频繁的访问者,拥有非常大的缓存,或者不经常上网。

对于使用不支持 http2 的浏览器的用户来说,串联文件是否有好处?

可能吧。不过,除了 Android 以外,HTTP/2 浏览器支持其实非常好 http://caniuse.com/#search=Http%2F2因此,您的大多数访问者可能已经启用了 HTTP/2。

也就是说,在 HTTP/2 下连接文件并没有 HTTP/1.1 下没有的额外缺点。好吧,可能有人会说,可以通过 HTTP/2 并行下载许多小文件,而需要作为一个请求下载较大的文件,但我不认为这会减慢速度。没有证据证明这一点,但直觉表明数据仍然需要发送,因此无论哪种方式都会有带宽问题,或者不会。此外,尽管 HTTP/2 减少了很多,但请求许多资源的开销仍然存在。对于大多数用户和网站来说,延迟仍然是最大的问题,而不是带宽。除非你的资源真的很大,我怀疑你会注意到在 I've go 中下载 1 个大资源,或者在 HTTP/2 中将相同的数据分成 10 个并行下载的小文件之间的区别(尽管你会在 HTTP/1.1 中注意到) 。更不用说上面讨论的 gzip 压缩问题了。

因此,在我看来,继续连接一段时间并没有什么坏处。在某些时候,您需要根据您的用户配置文件来判断缺点是否大于优点。

在这种情况下使用更大的文件并使用 HTTP2 会不会有什么坏处?这样,运行任一协议的用户都会受益,因为站点可以针对 http 和 http2 进行优化。

绝对不会受到任何伤害。如上所述,在 HTTP/2 下连接文件(基本上)没有额外的缺点,而在 HTTP/1.1 下则没有。它在 HTTP/2 下不再是必需的,并且有缺点(可能会减少缓存的使用,需要构建步骤,使调试变得更加困难,因为部署的代码与源代码不同......等等)。

使用 HTTP/2,您仍然会看到任何网站的巨大好处 - 除了最简单的网站,它们可能不会有任何改进,但也没有负面影响。而且,由于较旧的浏览器可以坚持使用 HTTP/1.1,因此它们没有任何缺点。您何时或是否决定停止实施 HTTP/1.1 性能调整(例如连接)是一个单独的决定。

其实只是理由not使用 HTTP/2 的原因是其实现仍然相当前沿,因此您可能还不太习惯在其上运行生产网站。

**** 2016 年 8 月编辑 ****

这个帖子 https://99designs.ie/tech-blog/blog/2016/07/14/real-world-http-2-400gb-of-images-per-day/由于图像较多、带宽受限,该网站最近引起了 HTTP/2 社区的一些兴趣,作为第一个记录的 HTTP/2 实际上比 HTTP/1.1 慢的示例之一。这凸显了这样一个事实:HTTP/2 技术和理解仍然是新的,并且需要对某些站点进行一些调整。看来天下没有免费的午餐啊!值得一读,但值得记住的是,这是一个极端的例子,大多数网站在性能方面受到 HTTP/1.1 下的延迟问题和连接限制的影响,而不是带宽问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化文件缓存和 HTTP2 的相关文章

  • 为什么 cross_val_predict 比 KNeighborsClassifier 的拟合慢得多?

    在 Jupyter 笔记本上本地运行并使用 MNIST 数据集 28k 条目 每个图像 28x28 像素 以下内容为27秒 from sklearn neighbors import KNeighborsClassifier knn clf
  • WPF 应用程序在第一次交互(例如单击按钮)后停止/冻结

    我目前在 WPF 中遇到问题 UI 加载正常 但每当进行第一次用户交互时 例如单击按钮 应用程序似乎会停止 或者例如 如果我有两个显示 MessageBox 的按钮 则第一次单击将等待几秒钟 然后显示MessageBox 但任何后续交互都是
  • 将嵌套循环计算转换为 Numpy 以加速

    我的Python程序的一部分包含以下代码段 其中一个新的网格 是根据旧网格中找到的数据计算的 网格是二维浮点数列表 该代码使用了三个 for 循环 for t in xrange 0 t step for h in xrange 1 hei
  • C# 的快速线程安全随机数生成器

    我需要在多个正在运行的线程中快速生成随机浮点数 我尝试过使用System Random 但它对于我的需求来说太慢了 并且它在多个线程中返回相同的数字 当我在单线程中运行应用程序时 它工作正常 此外 我需要确保生成的数字在 0 到 100 之
  • 动态 SQL 和 where case 哪个更好?

    我需要创建一个带有 12 个参数的存储过程 并使用这些参数的不同组合来过滤查询 所有 12 个参数都不是强制性的 就好像我传递 3 5 或 12 个参数取决于用户输入的搜索输入一样 我可以通过两种方式创建 即使用动态 SQL 查询或使用 C
  • 增量SQL查询

    我的应用程序有一组固定的 SQL 查询 这些查询以轮询模式运行 每 10 秒一次 由于数据库的大小 gt 100 GB 和设计 超级规范化 我遇到了性能问题 每当数据库上发生更改查询结果的 CRUD 事件时 是否可以对给定查询进行增量更改
  • 是否存在比 SVN 更快的集中版本控制?

    我已经使用 SVN 很长时间了 现在我们正在尝试使用 Git 我在这里谈论的不是中心化 去中心化的争论 我唯一关心的是速度 后一个工具要快得多 但有时 我需要使用一种集中式方法 这种方法比分散式方法更简单 更简单 学习曲线非常快 这节省了大
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • Emacs 行编号性能

    我试过了linum and nlinum 两者对于超过 100k 行的文件的性能都很糟糕 for x in 1 100000 do echo x done gt 100k txt emacs q 100k txt M x load libr
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • 带有闭包的 JavaScript 性能

    var name function n var digits one two three four return digits n var namenew function digits one two three four return
  • 将数据从一个线程传递到另一个线程的最快可能方法

    我正在使用增强spsc queue将我的东西从一个线程移动到另一个线程 这是我的软件中的关键位置之一 所以我想尽快完成它 我写了这个测试程序 include
  • 大数组上的 SSE 性能较慢

    我是 SSE 编程新手 所以我希望有人可以帮助我 我最近使用 GCC SSE 内在函数实现了一个函数来计算 32 位整数数组的总和 下面给出了我的实现代码 int ssum const int d unsigned int len stat
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • 将 pandas 数据帧拆分为子数据帧列表的最快方法

    我有一个大数据框df我有完整的清单indices中的独特元素df index 我现在想创建一个由元素索引的所有子数据帧的列表indices 具体来说 list df df loc x for x in indices 运行这个命令需要很长时
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 当浏览器的缓存已满时会发生什么?

    当网络浏览器的缓存已满时会发生什么 可以 删除缓存中最旧的项目以腾出空间 完全停止缓存 IE Firefox Chrome 和 Safari 等主要浏览器是否记录了此行为 谷歌声称每个浏览器都使用 LRU 来决定转储什么 Here code
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐