那些年,克服延迟之道
最后更新于:2022-04-01 20:52:25
# 3. 那些年,克服延迟之道
再困难的问题也有解决的方案,但这些方案却良莠不齐。
## 3.1. Spriting
Spriting是一种将很多较小的图片合并成一张大图,再用JavaScript或者CSS将小图重新“切割”出来的技术。
网站可以用该技术来提速:在HTTP 1.1里,下载一张大图比下载100张小图快得多。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-08-09_55c75bc173aaf.png)
但是当某些页面只需要显示其中几张小图时,这种方案的缺点就凸显出来了:它必须将整张大图都从cache里取出,而不能将最频繁使用的那些图片保留在cache里。
## 3.2. 内联(Inlining)
内联是另外一种防止发送很多小图请求的技巧,它将图片的原始数据嵌入在CSS文件里面的URL里。而这种方案的优缺点跟Spriting很类似。
~~~
.icon1 {
background: url(data:image/png;base64,) no-repeat;
}
.icon2 {
background: url(data:image/png;base64,) no-repeat;
}
~~~
## 3.3. 拼接(Concatenation)
大型网站往往会包含大量的JavaScript文件。一些前端工具能帮助开发人员将这些文件合并为一个大的文件,从而让浏览器能通过一个请求下载完,而不是发无数请求来分别下载那些小的JavaScript。但如果某页面只需要其中一小部分代码,它也必须下载完整的那份。而一个小小的文件改动也会造成大量数据的重载。
这种手段也给开发者造成了很大的不便。
## 3.4 分片(Sharding)
最后一个我要说的性能优化技术叫做分片。顾名思义,分片就是把你的服务分散在尽可能多的主机上。这种方案乍一听比较奇怪,但是实际上在它背后却有非常深刻的道理!
最初的HTTP 1.1规范提到一个客户端最多只能对同一主机建立两个TCP连接。因此,为了不和规范冲突,一些聪明的网站使用了新的主机名。这样的话,用户就能和网站建立更多的连接,从而降低载入时间。
后来,两个连接的限制被取消了,现在的客户端可以轻松地和每个主机建立6-8个连接。但连接的上限却是依然存在的,所以网站依然会用这种技术来提升连接的数量。随着资源个数的提升(上面章节的图例),网站需要更多的连接来保证HTTP协议的效率,从而提升载入速度。在现今的网站上,使用50甚至100个连接来打开一个页面并不罕见。[httparchive.org](http://httparchive.org)的最新记录显示,在Top 30万个URL中平均使用38(!)个TCP连接来显示页面。并且这个数字仍然在缓慢的增长。
另外一个将图片或者其他资源分发到不同主机的理由是可以不使用cookies,毕竟现今cookies的大小已经非常可观了。无cookies的图片服务器意味着更小的HTTP请求和更好的性能!
下面的图片展示了访问一个瑞典著名网站的时候的数据包,请注意这些请求是如何被分发到不同主机的。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-08-09_55c75bc18a3e9.png)
';