对减少HTTP请求的疑问

教条

根据各种Web性能优化手册,“减少HTTP请求”这一条始终被放在显眼的位置,其中就包括著名的YSlowGoogle Page Speed,两者对这一教条的解释分别是:

80% of the end-user response time is spent on the front-end. Most of this time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc.

YSlow表示,前端的多数时间是用在下载图片、样式表、脚本、Flash等,所以要减少HTTP请求。

RTT is the major contributing factor to latency on "fast" (broadband) connections.

Page Speed则表示,RTT(请求往返时间)是导致连接快不起来的主要原因,所以要减少,即减少HTTP的请求数。

疑惑

很少人会对这2大优化守则产生怀疑,因为它们即真理、即教条、即必须遵守之则,如有违逆,虽远必诛……

但是如果认真地去解读这2条规则,其他他们都表达了一个意思:网络上的往返越多,响应的速度就越慢。

但是他们却忽略了一个很重要的事情,那就是工作总用时多,并不代表任务完成时间也多,因为这里有一个概念,叫作并行

试想一个任务,用一个线程跑,和用100个线程跑,哪一个总用时更少?答案其实是一个线程,因为100个线程之间有线程切换的开销、有结果join的时间、有任务分割的时间……但是从结论上来看,哪一个能更快地跑完任务?答案是多线程,这就是并行计算的理论来源。

事实上,资源的下载也是如此,如果并行的话,多个资源的下载时间不见得会小于一个资源,如下图是一个合并后的资源的下载示意:

大资源下载示意

上图用来表示一个较大的资源的下载过程,其中不同的颜色分别对应:

  • 蓝色:TCP链接建立时间
  • 绿色:请求头发送时间
  • 紫色:服务器处理时间
  • 橙色:响应头发送时间
  • 红色:文件传输时间
  • 灰色:文件解析执行时间

如果将这个大资源分解成3个相等的小资源的话,那么他们的下载就可能是这样的:

小资源下载示意

由于浏览器只有一个线程可以对文件进行解析和执行,因此灰色的解析部分必定是串行的,需要相互等待。

比较2张图,假设其中的每一小块的时间为t,可以发现这样一个结论:一个大资源的加载,使用了13t的时间,而将大资源分解后,虽然总共用了21t的时间,但是客户端真正等待的时间却只有9t,比合并资源的方式节约了4t。

这就是并行的效果,当然要实现这个效果,是有前提的:

  • 并行的连接数没有超过浏览器的限制,这里假设4并行是一个比较合理地、照顾到各浏览器的值。
  • 服务器能顶得住,不会因为并发连接过多而导致处理时间变长。
  • 网络足够稳定,这一点将保证TCP建立、请求头发送、响应头发送这3段时间是稳定的。
  • 浏览器的资源加载不会阻塞,如IE6-7在下载js文件时会阻塞后续资源的请求,则不可能实现并行。

缓存的考虑

合并资源有另一个好处,就是在缓存之后,只需向服务器验证一次即可。但是再和拆分资源的加载过程作一个比较,如果采用带验证的缓存,不难得出下图:

服务器缓存的情况

而如果使用客户端的缓存,则是以下情况:

客户端缓存的情况

从上面2张图中可以看到,即便在有缓存的情况下,如果满足一定的条件,可以进行并发的话,若干个小资源的加载情况下客户端的等待时间和合并为一个大资源后是相同的,并没有多余的消耗。

总结

一个最基础的结论是,加载资源总用时客户端等待时间是2个完全不同的概念,他们之间并不存在正比的关系,而在宽带普及的当前时代,多数网络资源并不是按流量收费的,因此前端的优化应该更关注于客户端等待时间,而不是加载资源总用时和流量之上。

事实上,一个最经典的应用就是下载软件,从90年代的NetAnt开始,到其后的网际快车、迅雷,无一不具有“多线程下载”的能力。事实上多线程下载同样会因为线程的切换、文件分段的空间分配、最后多段碎片的拼接等导致总耗时更多,但也确确实实极大地缩短了下载的时间。在对页面的资源加载作优化时,是不是也可以参考一下这个模型呢?

由此,对资源的切分将会从单纯的“合并”的级别,提升到一种完全艺术的程度,综合考虑不同浏览器对资源加载的策略,最大限度利用浏览器的并行下载能力,从而正确、最优地分配静态资源域名,切分静态资源,压榨浏览器全部的能力,进一步地提升页面加载的速率。这虽然大大提高了资源管理、分解的复杂度,但是对于追求极限而言,本人认为这样才是真正的最佳实践。

最后,本文完全没有全部否定减少HTTP请求数这一优化原则的意思,只是希望从另外一个角度看问题,保持着一定的怀疑的心态来重新审视这一原则,拒绝不经过思考的无意义的遵循,从而寻找到在特定环境下,最适合、最优化的方案。

本文永久地址:http://www.otakustay.com/doubt-on-fewer-http-requests/

标签: 优化
posted @ 2011-05-19 13:54 Gray Zhang 阅读(3168) 评论(50) 编辑 收藏

 回复 引用 查看   
#1楼2011-05-19 14:02 | 在北落      
很显著的一点就是 合在一起的图的大小<那些小图加起来的大小
 回复 引用 查看   
#2楼[楼主]2011-05-19 14:04 | Gray Zhang      
@在北落
是的,图片来说确实是有优势的,因为有色盘和文件头
但是对于纯文本的资源,比如最常见的js和css,合并以后的大小就是n个小文件大小的总合
再而且,即便n张小图会导致尺寸上有所增加,但是综合考虑,也许并行下载依旧会更快……

 回复 引用 查看   
#3楼2011-05-19 14:06 | DroidXgnaW      
我跟你的理解有点不同,我对“减少HTTP请求”的理解是尽可能设计出需要HTTP请求次数少的页面,但同时又能满足应用需求。
 回复 引用 查看   
#4楼[楼主]2011-05-19 14:07 | Gray Zhang      
@DroidXgnaW
那么就需要回答一个问题了,HTTP请求次数尽可能少是为了什么呢?

 回复 引用 查看   
#5楼2011-05-19 14:09 | 天然本色_玛瑙王国      
沙发,好文
 回复 引用 查看   
#6楼2011-05-19 14:09 | helloworld2      
都是看具体情况和瓶颈的,有时候合并有时候分开

 回复 引用 查看   
#7楼[楼主]2011-05-19 14:11 | Gray Zhang      
@helloworld2
这个观点非常赞,也正是我认同的。只是现实情况是,更多的人是一股脑儿地合并,原因就来自于YSlow和PageSpeed,或者某本号称优化圣经的猎狗书……

 回复 引用 查看   
#8楼2011-05-19 14:20 | kenny.guo      
@Gray Zhang
一个最基础的结论是,加载资源总用时和客户端等待时间是2个完全不同的概念。
我是这么理解的:客户端等待时间=提交到服务器的时间+服务器处理的时间+资源下载时间+加载资源的时间。在满足功能的情况下“减少HTTP请求”既能减少客户端等待的时间又能减少服务器压力

 回复 引用 查看   
#9楼2011-05-19 15:10 | DroidXgnaW      
引用Gray Zhang:
@DroidXgnaW
那么就需要回答一个问题了,HTTP请求次数尽可能少是为了什么呢?


为了加快页面显示速度,节省资源。

客户的网络不按流量收费,但不代表商户的带宽和硬件资源收益最大化了。

设计出精美实用的页面,比你能够开发出可以在4核上跑4线程下载网页的页面要有用的多,也难得多。

 回复 引用 查看   
#10楼[楼主]2011-05-19 15:15 | Gray Zhang      
@DroidXgnaW
嗯,商户通常是按带宽收费的,而带宽收费的一个典型特征就是按最高峰使用带宽收费
即是说,当站点并没有太到最高峰时,如非上网高峰期时,带宽是“浪费”的,无论你用不用,都要收钱
那么是不是可以在这段时间里,尽可能地压榨这个带宽,使用预加载、分离资源等各种方式,以客户的加载时间为第一优先,来进行一种资源设计呢?

 回复 引用 查看   
#11楼2011-05-19 15:30 | 徐少侠      
浏览器规范里面似乎仅仅支持2个并发链接。
只是以前除了IE,都不遵守规则罢了。
现在么,大家都不遵守规则。

 回复 引用 查看   
#12楼2011-05-19 15:47 | colorboy      
我的理解。
你把request整个过程,想象成多个部分组成。
合并后,少了前后几个部分,
所以耗时少了。
就像connection,不用每次都要创建一个,直接从应用池里拿一个用。省了时间。

 回复 引用 查看   
#13楼2011-05-19 15:55 | 钧梓昊逑      
我的理解是减少服务器的并发压力,从而提高响应速度。
 回复 引用 查看   
#14楼2011-05-19 15:57 | 钧梓昊逑      
如果同时只有一个用户访问站点,博主的模型是正确的,但如果同时有很多的用户访问,过多的连接将使部分用户进入队列,从而降低响应速度。
 回复 引用 查看   
#15楼[楼主]2011-05-19 16:00 | Gray Zhang      
@钧梓昊逑
根据我的经验,我有理由相信,服务静态资源的服务器被满负荷的几率是相当小的,一个静态文件的服务周期远远小于动态响应,Tomcat走完一次Servelet的生命周期,可能足够Nginx响应好多个静态文件
如果有效地做到动静态的分离,个人倒不认为静态资源切分后会导致服务器无法承受呢,毕竟我们这边只用了4台服务器,就服务了日该20亿次的需求……

 回复 引用 查看   
#16楼2011-05-19 16:12 | DroidXgnaW      
引用Gray Zhang:
@DroidXgnaW
嗯,商户通常是按带宽收费的,而带宽收费的一个典型特征就是按最高峰使用带宽收费
即是说,当站点并没有太到最高峰时,如非上网高峰期时,带宽是“浪费”的,无论你用不用,都要收钱
那么是不是可以在这段时间里,尽可能地压榨这个带宽,使用预加载、分离资源等各种方式,以客户的加载时间为第一优先,来进行一种资源设计呢?


你这是本末倒置,如果哪个老板雇佣了你来做预算,那他就亏大了。

 回复 引用 查看   
#17楼[楼主]2011-05-19 16:15 | Gray Zhang      
@DroidXgnaW
我的这个说法来自于2010年Velocity Web性能运维大会上,腾讯的相关分享中提到的思路。
因为比如说一个公司买了2G的带宽,一个月100万,这是因为他在一天的最高峰,比如18:00的时候,需要这2G的带宽才可以服务所有的用户。
但如果现在是凌晨2:00,用户不到高峰期的1%,则你只能用掉20M的带宽,剩下的1G+的带宽完全没有使用,但是你交的钱却没有变化,这就是一种“浪费”
那么,有什么理由,不在2:00的时候,把剩下的1G+带宽利用起来,使用种种方法,服务于这1%的用户,让他们感觉更快更舒服呢?这个时候的带宽完全是0成本呢

 回复 引用 查看   
#18楼2011-05-19 16:17 | Ariel Lu      
我觉得楼主的测试还是过于极端了,如果一个页面有一百个资源文件,甚至两百、三百,合并http请求是很有意义的
 回复 引用 查看   
#19楼[楼主]2011-05-19 16:18 | Gray Zhang      
@Ariel Lu
嗯,所以说我从来不“完全否定”合并的意义,而是希望“寻找到在特定环境下,最适合、最优化的方案”,这有很高的复杂性,且应用场景确实不多,只是以此为记,在真正遇到的时候,不至于手忙脚乱

 回复 引用 查看   
#20楼2011-05-19 16:20 | Ivony...      
其实现在都是keep-alive,有多少损耗值得怀疑。。。。
 回复 引用 查看   
#21楼[楼主]2011-05-19 16:22 | Gray Zhang      
@Ivony...
这倒不是,虽然keep-alive了,但是这只是说一个连接的重用。如果资源是4线并行下载的,则需要打开4个连接,他们分别有自己的连接建立时间,这不是keep-alive可以避免的……keep-alive只能保证一个资源完成传输后,下一个资源的请求可以重用上一个,但这是一种“串行”模型

 回复 引用 查看   
#22楼2011-05-19 16:23 | Ivony...      
引用DroidXgnaW:
引用Gray Zhang:
@DroidXgnaW
那么就需要回答一个问题了,HTTP请求次数尽可能少是为了什么呢?


为了加快页面显示速度,节省资源。

客户的网络不按流量收费,但不代表商户的带宽和硬件资源收益最大化了。

设计出精美实用的页面,比你能够开发出可以在4核上跑4线程下载网页的页面要有用的多,也难得多。



这与HTTP请求次数有什么关系?

 回复 引用 查看   
#23楼[楼主]2011-05-19 16:25 | Gray Zhang      
引用Ivony...:
引用DroidXgnaW:
引用Gray Zhang:
@DroidXgnaW
那么就需要回答一个问题了,HTTP请求次数尽可能少是为了什么呢?


为了加快页面显示速度,节省资源。

客户的网络不按流量收费,但不代表商户的带宽和硬件资源收益最大化了。

设计出精美实用的页面,比你能够开发出可以在4核上跑4线程下载网页的页面要有用的多,也难得多。


这与HTTP请求次数有什么关系?


这位的意思应该是,太多的HTTP请求,导致重复的请求头和响应头,使得服务方需要有更大的带宽,从经济上来说有所损失吧……

 回复 引用 查看   
#24楼2011-05-19 16:45 | testzhangsan      
楼主牛逼,百度的!
 回复 引用 查看   
#25楼2011-05-19 17:31 | 阿森纳      
引用Gray Zhang:
@DroidXgnaW
我的这个说法来自于2010年Velocity Web性能运维大会上,腾讯的相关分享中提到的思路。

没接触过这么大量的请求,我想知道,如果按照楼主的思路,会对18:00请求网站的那部分用户,有什么影响?

 回复 引用 查看   
#26楼[楼主]2011-05-19 17:33 | Gray Zhang      
@阿森纳
这就看一个策略了,根据腾讯的同事提出的,他们的方式是根据环境决定资源的划分,18:00的时候可能就考虑使用合并后的资源,并关闭资源预加载的开关等等,保证在高峰期以节省带宽为优先吧

 回复 引用 查看   
#27楼2011-05-19 17:40 | NetRube      
减少HTTP请求是为了减少服务器压力~
而不是为了减少客户端加载资源或等待的时间~~
博主是不是有点本末倒置了哈~~~

 回复 引用 查看   
#28楼[楼主]2011-05-19 17:43 | Gray Zhang      
@NetRube
YSlow和PageSpeed,从名字上就能看出,他们管的是速度、时间,而几乎不会理睬服务器的压力如何
而减少HTTP请求这条规则正是由这2位提出来的,我的第一段已经摘录了他们的解释,均是表示“用户的时间消耗在了请求往返上”,因此才需要减少请求
而我想要质疑的理论正是这一点,同时我也已经提了可以质疑的前提是“服务器吃得消”……

 回复 引用 查看   
#29楼2011-05-19 17:51 | Ivony...      
引用Gray Zhang:
@Ivony...
这倒不是,虽然keep-alive了,但是这只是说一个连接的重用。如果资源是4线并行下载的,则需要打开4个连接,他们分别有自己的连接建立时间,这不是keep-alive可以避免的……keep-alive只能保证一个资源完成传输后,下一个资源的请求可以重用上一个,但这是一种“串行”模型


由于有了keep-alive,所以真正的TCP链接的建立,取决于浏览器开几个线程罢了。

譬如说浏览器开四个线程,又是keep-alive模式,那么即使一个页面要发起100次请求,最终开启的TCP链接也就4个而已。

 回复 引用 查看   
#30楼[楼主]2011-05-19 17:56 | Gray Zhang      
@Ivony...
在HTTP协议下,2次并发的请求是不可能使用同一个TCP链路的,即TCP链路上发送的数据不可能是这样的:
A请求片段1 - B请求片段1 - A请求片段2 - A请求片段2 - B请求片段2
因为HTTP协议下,是使用Content-Length来配合keep-alive达到链路重用的,这意味着必定是一次取完整个响应
所以,如果真想用keep-alive,那么资源B必须在资源A完全拿到后才能发起请求,这种等待会硬生生地将并行变成串行,我文中所提的并行优势荡然无存,还不如合并成大文件传输一次……

就以你说的4线程为例,如果发起100个请求,在此假设每个请求用的时间是一模一样的,看到的瀑布图其实是这样的:
----
----
----
----
    ----
    ----
    ----
    ----
        ....
        ....
        ....
        ....

一共25个轮回,每个轮回完成4个资源的加载,而我文中所提的,一个核心概念就是“要用满一个轮回里可以使用的4个请求”

 回复 引用 查看   
#31楼2011-05-19 18:01 | helloworld2      
引用Gray Zhang:
@helloworld2
这个观点非常赞,也正是我认同的。只是现实情况是,更多的人是一股脑儿地合并,原因就来自于YSlow和PageSpeed,或者某本号称优化圣经的猎狗书……

这本书不错的《Apress.Ultra.Fast.ASP.NET.Oct.2009》

 回复 引用 查看   
#32楼2011-05-19 18:02 | Ivony...      
引用Gray Zhang:
@Ivony...
在HTTP协议下,2次并发的请求是不可能使用同一个TCP链路的,即TCP链路上发送的数据不可能是这样的:
A请求片段1 - B请求片段1 - A请求片段2 - A请求片段2 - B请求片段2
因为HTTP协议下,是使用Content-Length来配合keep-alive达到链路重用的,这意味着必定是一次取完整个响应
所以,如果真想用keep-alive,那么资源B必须在资源A完全拿到后才能发起请求,这种等待会硬生生地将并行变成串行,我文中所提的并行优势荡然无存,还不如合并成大文件传输一次……

就以你说的4线程为例,如果发起100个请求,在此假设每...



你是说同一个资源让浏览器多线程下载?

我的意思是,即使页面上有一百张图片,那么不意味着会要发起100次TCP连接。

 回复 引用 查看   
#33楼[楼主]2011-05-19 18:03 | Gray Zhang      
@Ivony...
嗯,大概文章实在写得不好……我的意思其实就是,我们原来喜欢把3个css合并成一个,现在我想把他再拆回去变成3个,然后依靠并发下载,比原来那1个下得还快……

 回复 引用 查看   
#34楼2011-05-19 21:04 | Jesong      
减少请求数,还可以减少DSN解析。
 回复 引用 查看   
#35楼[楼主]2011-05-19 21:06 | Gray Zhang      
@Jesong
现在浏览器几乎个个带DNS缓存功能,且Windows本身也有个DNS Client服务做DNS缓存,这点我倒觉得不至于需要太在意啦
YSlow里的减少DNS查询这一环节,说的就是在DNS能缓存的基础之上进行优化呢

 回复 引用 查看   
#36楼2011-05-20 01:13 | 微生物      
说到底还是一个客户端和服务器的最优均衡的选择问题吧。
 回复 引用 查看   
#37楼2011-05-20 08:36 | snowsky      
其实,对中小站长来说,合并资源请求多是为服务器压力考虑的吧,毕竟中小站长们基本上都只拥有一台服务器,如果是租用空间,则有最大并发连接这一限制。
 回复 引用 查看   
#38楼2011-05-20 09:13 | 贤达      
写得很用心! 不错支持一下!
 回复 引用 查看   
#39楼2011-05-20 09:21 | Bono Joshua      
为什么在优化时非要将并发加载和合并资源分开呢?
 回复 引用 查看   
#40楼2011-05-20 09:26 | Jesong      
减少请求数其实还有另一种意思,就是让网页最快的呈现出来。以减小用户的心理等待时间。比如:现在的京东等B2C网站,他们的图片并不是网页一请求就下载,而是分屏下载的。这样,用户看多少,我请求多少。加快的网页的呈现,这也是减少请求数。
你们说呢。

另外,我觉得每次请求都有一定的时间损耗,合并起来还是有一定的优势的。还有,图片,样式,脚本这些在本地都有缓存。浏览器去请求的时候会判断是否有缓存,你们认为是判断多次快呢还是判断一次快?

 回复 引用 查看   
#41楼2011-05-20 11:18 | BeckFun      
引用Gray Zhang:
@Jesong
现在浏览器几乎个个带DNS缓存功能,且Windows本身也有个DNS Client服务做DNS缓存,这点我倒觉得不至于需要太在意啦
YSlow里的减少DNS查询这一环节,说的就是在DNS能缓存的基础之上进行优化呢

博主神马都不在意却灰常在意连接请求的个数...哈哈哈哈哈哈...做论证不能是在一个绝对的实验室环境下论证的...
网页加载或者说网页产生http请求的不止JS CSS...还有可能是CSS里面的背景图...img标签里的图片连接...等等...浏览器有四个线程...那又该如何分配线程呢?等待调度?阻塞?
其实LZ自己的论点也不稳定..因为他的论点是建立在很多前提条件之下...

下载软件之所以能大幅度缩短下载时间那是因为他是在剥夺其他网络工具使用网络资源的前提下完成的..当你用新版迅雷开起上网有限模式..并且使用浏览器上网..他的下载速度也就和用浏览器另存为的速度相当...

 回复 引用 查看   
#42楼2011-05-20 11:18 | Rain.      
减少HTTP请求,可以减少DNS的解析,这在访问国外网站的时候,效果比较明显
因为一个请求,要经过20,30个节点。
用过美国主机的童鞋,你们懂的哦

 回复 引用 查看   
#43楼[楼主]2011-05-20 11:27 | Gray Zhang      
@BeckFun
厄,首先,迅雷的的有限模式完全是为了树立正面形象而存在的,开启后本身成为一个单线程的下载工具……
如果要参考多线程下载的效果的话,96年左右的NetAnt应该是最好的软件,除了多线程下载,不做任何其他的优化……10线程下载的速度大概会是单线程的6-7倍(服务器确实支持的前提下),在当年宽带刚刚推出的时候,各服务器依旧以56K猫的速度为标准进行网络限速,用上NetAnt后效果还是非常明显的哦
另外任何软件,只要会下载,其实就是在“剥夺其他工具的网络资源”,毕竟带宽就只有可怜的小水管而已嘛,只是迅雷剥夺得厉害了些,看上去就比较丑恶?
而且哪怕浏览器可以多剥夺一些,但导致一个非常大型的页面加载得很快,又何乐不为呢……

嗯,我提出的其实是一种更接近理论的概念,理论到实践总是要经过一个漫长的摸索过程,但如果因此而绝然地否定理论,我想无论是个人还是技术社区,都无法在这种环境下成长吧……
网页会产生很多的HTTP请求,这个我是理解的,平均一个页面有14个左右是很正常的,但是这些请求如何分配却是我们前端开发者可以控制的
以Chrome为例:
1、下载head中定义的所有js/css资源,并阻塞后续资源的请求
2、以6个并发连接,开始下载body中的所有js/css资源
3、同样6个并发连接,开始下载图片/flash/css背景图等资源
当然第2步和第3步其实是一起的,始终保持6个并发连接满负载,只是对资源有一个排序后优先下载js/css的策略在里面

可以看出来,Chrome对资源的下载很有规律,在这处规律的支持之下,其实我们是可以通过调整资源的位置、顺序等,来控制浏览器加载的先后的……
其他浏览器也是如此,现在唯一找不到规律的是Opera,不过由于使用人群实在不多,大概忽略也不见得会有严重的影响……

 回复 引用 查看   
#44楼2011-05-20 11:39 | DroidXgnaW      
引用Gray Zhang:
@DroidXgnaW
我的这个说法来自于2010年Velocity Web性能运维大会上,腾讯的相关分享中提到的思路。
因为比如说一个公司买了2G的带宽,一个月100万,这是因为他在一天的最高峰,比如18:00的时候,需要这2G的带宽才可以服务所有的用户。
但如果现在是凌晨2:00,用户不到高峰期的1%,则你只能用掉20M的带宽,剩下的1G+的带宽完全没有使用,但是你交的钱却没有变化,这就是一种“浪费”
那么,有什么理由,不在2:00的时候,把剩下的1G+带宽利用起来,使用种种方法,服务于这1%的用户,让他们感觉更快更舒服呢?这个时候的带宽完全是0成本呢


用户体验的一方面就是页面响应速度。

如果你在高峰期的响应速度和在平均期响应速度差别太多,那么针对高峰期的带宽就浪费了。相反,在平均期的响应速度低于最佳用户体验设立的标准相应速度,你下载速度再快,用户也感觉不出来有多大好处。这就是收益,也就是哲学上经常讲的将一个金币给一个穷人和给一个富人的福祉是不一样的。

所以系统设计目标不是如何把带宽占满,而是如何设计好的系统让用户在高峰期的体验和平均期的体验一致或者接近一致。这种一致性就会带给客户“稳定”的感性认识,从而产生对系统的“信任”感。

 回复 引用 查看   
#45楼2011-05-20 12:48 | 动静皆宜      
服务器http连接数要消耗CPU,是有瓶颈的,甚至有些空间商会限制连接数。普遍意义上说,网络攻击的主要方式DDOS,就是靠大量消耗服务器连接数造成当机的。性能的指标可不仅仅是带宽而已,现在用户基数越来越大,连接数这个指标也会越来越重要,特别是在严厉网络监管的中国,新增服务器、ip和域名是如此困难的时候。
 回复 引用 查看   
#46楼2011-06-24 17:19 | 56707801      
引用Jesong:
减少请求数其实还有另一种意思,就是让网页最快的呈现出来。以减小用户的心理等待时间。比如:现在的京东等B2C网站,他们的图片并不是网页一请求就下载,而是分屏下载的。这样,用户看多少,我请求多少。加快的网页的呈现,这也是减少请求数。
你们说呢。

另外,我觉得每次请求都有一定的时间损耗,合并起来还是有一定的优势的。还有,图片,样式,脚本这些在本地都有缓存。浏览器去请求的时候会判断是否有缓存,你们认为是判断多次快呢还是判断一次快?



这个我感觉有点。。lz这里讲的是切分资源平行下载,和你这个延时加载是不一样的吧

至于判断缓存,我的办法就是一个js版本控制其他加载,这样整个页面的js只用判断一次,其他的全都设置超长过期时间,如果服务器更新了再用加版本号的方法刷新客户端的缓存,呵呵,版本文件自带一个异步模块加载类,这样感觉还可以

 回复 引用 查看   
#47楼2011-07-14 22:36 | 深水幽蓝      
楼主你忽略了一个客观存在的事实,你这个实验是在连接数小于等于浏览器的最大连接数的情况下,但是事实是现在的所有页面中,浏览器所要建立的连接大大超过了最大连接数
 回复 引用 查看   
#48楼[楼主]2011-07-15 02:01 | Gray Zhang      
@深水幽蓝
那倒不见得,把所有的链接(比如说6个)全部交付去下载css/js也是不错的选择啊,图片毕竟只是修饰性的而非功能性的,晚一些下载也没什么问题。那么我把原先一个页面里的1个js和1个css分成4个js和2个css,也能有点收益嘛

 回复 引用 查看   
#49楼2011-07-18 22:37 | 寻自己      
前端优化以减少http请求数是正确的

且不说减少请求数对节省带宽 和 减少服务器压力 而来带来的益处

单从 一次 http 请求,就要经过 域名解析 -> 建立连接 -> 发送请求 -> 等待响应 -> 接收数据 这几步操作,如果你 CTRL + F5 刷新一下网页,用 firebug 看下的话,你就会发现,其实 接收数据 这一步并没有太耗时,主要的耗时都是在 等待响应 上面的,所以,下载 并不是一次 http 请求最主要的性能点,最浪费时间的还是等待响应这个过程;同时,在静态资源 IIS 缓存后,图片或者 js 之类,还是会有一次请求到 IIS 检查文件状态的

当然,压缩图片也不是以盲目的合并和压缩,一般图片压缩合并的最大上限是 150KB

减少请求数,对于 减轻 IIS 压力仍然很重要,对于正常的网页来说,减少http 请求数仍然是前端优化的重中之重

对于 楼主 "服务静态资源的服务器被满负荷的几率是相当小的" 只一句表示很深的质疑,平时我优化的站点,有一个站点,页面逻辑简单,但是就是 访问量大,在不错的web服务器上,当 请求数 3W +(大多为静态资源) 的时候,cpu 就 90% + 了,更要命的,如果web 为下载服务器,连接数过高,也会出现比较大的性能问题,所以,静态资源,在高访问量下,仍然会造成负荷的

 回复 引用 查看   
#50楼[楼主]2011-07-18 22:42 | Gray Zhang      
@寻自己
我先说说我这边的状况吧,4台服务器,每日20亿PV,冗余率大于50%,也就是说坏掉2台还完全没有问题,当然我这边的项目比较特殊,全是静态文件,服务器使用lighttpd来架设,合理处理了缓存
至于你说的一个HTTP请求的6个部分,我在文中也特别提到了,而且用图来表示了,从理论来看,只要最大链接数没用满,拆分的优势似乎依旧存在