最近在改写博客的主题,其中一个比较重要的方面就是研究如何提升网页在浏览器中加载的效率。本 文主要从页面内资源加载的角度出发来探讨这个问题,网上也有很多关于这方面的争论,主要分为主张多资源文件从而并发下载的“主多派”和主张整合页面资源到 较少资源文件的“主少派”。那么什么才是真相?多资源文件真的能做到并发下载吗?
其实每个网站都应该就其各自的特点来进行优化,更多的时候并行下载资源和减少连接数开销是一种博弈的效果。现在的浏览器都使用并发连接来提升浏览器的性能,具体参见:并发连接数对浏览器加载速度的测试 。在我看来,提高网页加载性能的关键就在于合理的利用这些默认的数据合理的排布HTML中引用到的CSS和JS脚本文件以及合理控制这些资源文件的数量。
与浏览器遇到JavaScript是否阻塞有关
首先来看看我们的浏览器是怎么加载页面资源的,以我室友tomsheep的博客http://tomsheep.net 为例子:
首先,浏览器发起直接对目标html的请求,然后分析其中用到的资源并下载,浏览器有自己的规则来判断什么样的资源可以被并行下载,什么样的不可以,参考pagespeed的doc 所说的,浏览器对加载顺序有着特殊的喜好:JS的出现会延迟后续CSS的下载,因为JS会改变页面元素,浏览器会延迟整个页面的渲染直到JS被下载解释并执行,所以必须让CSS的链接在JS前面以达到尽可能的并行。
举个pagespeed 上的例子:
1
2
3
4
5
6
7
|
<
head
>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet1.css"
/>
<
script
type
=
"text/javascript"
src
=
"scriptfile1.js"
/>
<
script
type
=
"text/javascript"
src
=
"scriptfile2.js"
/>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet2.css"
/>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet3.css"
/>
</
head
>
|
如果我们的html代码是这样子的,那么浏览器下载CSS会被前面两个JS给阻塞住,导致如下图般瀑布式的加载:
而当CSS和JS的加载顺序变成如下代码所示的时候,就可以避免阻塞下载的情况发生:
1
2
3
4
5
6
7
|
<
head
>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet1.css"
/>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet2.css"
/>
<
link
rel
=
"stylesheet"
type
=
"text/css"
href
=
"stylesheet3.css"
/>
<
script
type
=
"text/javascript"
src
=
"scriptfile1.js"
/>
<
script
type
=
"text/javascript"
src
=
"scriptfile2.js"
/>
</
head
>
|
可以看到,页面资源在html中出现的顺序对浏览器是否并行下载资源有着重要的影响,并不是只要出现多个资源文件都能并行的下载。
与浏览器支持的并发连接数有关
在HTTP 1.1协议中要求浏览器访问同一host的连接数不得大于2,但事实上当前绝大多数浏览器都违背了这一要求,具体参见:并发连接数对浏览器加载速度的测试 ,实际的默认连接数的多少跟操作系统以及浏览器版本有关。但我们基本上可以认为,浏览器的并发连接数大于6(忽略过时的浏览器,比如IE6)。
浏览器在进行每一次请求资源的过程中,都需要进行DNS Lookup来将域名翻译成IP地址并且新建一个TCP连接(如果没有keepalive或者keepalive timeout了),因此连接越多由此带来的overhead越大。而且,一旦资源文件超过了浏览器支持的最大并发数量,那么必定有资源要被延迟下载。比 如加载某网页需要下载13个资源文件(包含原始的html)、全都是CSS不会产生JS延迟、每次请求耗时100ms,那么浏览器第一次连接用于请求 html,第二到第七次连接并发请求2-7号资源,第八到第十三次连接并发请求8-13号资源,可以看到,浏览器在并发连接的情况下也用了300ms。而 如果将13个文件合并成7个文件的话,用200+ms就能完成(单个文件增大后传输会稍慢,不过少了DNS Lookup以及TCP连接的overhead,整体性能会有一个飞跃)。
综上所述,并行下载和降低连接overhead需要达到一个平衡状态才是一个好的方案,片面的追求较少的连接数或较高的并行性都是不可取的。这个平 衡状态是因站点而已的,网站管理员需要根据各自网站的特点选用合适的技术来提升访问效率(当然服务器的性能也是相当重要的因素)。同时也推荐给大家一个网 站,http://site-perf.com/ ,它能够模拟浏览器用不同的连接数来测试你的网站,和Firebug插件一样对调优很有帮助。
常用的技术
CSS Sprites ,用来将不经常改动的小图片整合成一张大图片,在CSS中利用background- position、width和height来控制显示的区域。优点是能显著的减少连接数以减少overhead而且可以被复用。缺点是制作起来比较费功 夫,而且没有什么好办法解决repeat的背景图(因为大小未知)。
Data URL 和 DHTML ,通过Base64编码将二进制文件(比如图片)捆绑到HTML/CSS中。 优点是制作简便,也能减少连接数。缺点是BASE64在一定程度上会增大文件大小(即使用了GZip压缩);浏览器也要重新解码显示,会带来一定的性能问 题;最重要的是,无法被缓存,每次请求HTML/CSS都会加载一遍。
CDN ,全称Content Delivery Network,即内容分发网络。现在有一定规模以及并发访问量需求的站点(比如网易和新浪等)都将各自的页面资源(CSS/JS/图片等)分发在不同的 host主机上,能让浏览器同时从多个host上下载资源而且也能根据负载和网络状况等因素将用户的请求递交到离用户最近的主机上,提升可靠性。成本巨 大,不是一般人能玩得起的。当然有一些cdn站点提供诸如jquery之类的服务,在jQuery官方下载 可以看到介绍,经我试验下来微软的ajax.aspnetcdn.com响应速度最快,优点有很多,速度和稳定性咱就不提了,更重要的是对浏览者来说他们可能已经请求过该脚本并放在缓存中了。
研究了各自的利弊之后得出我博客主题所使用的策略:主要使用CSS Sprites,用Data URL来解决背景repeat问题。当然,这也是因站点而已的,对于小站点(比如我的博客)之类的,可以把所有用到的图片整合到一张图片中;对于那些大站 点,就应该把相近的功能整合到一张图中,这样就算有调整,客户端也不用下载整张大图,只需要更新修改的部分就可以。不管是CSS Sprites还是Data URL都是针对网站本身的样式来说,不适合把内容中的图片(比如新闻中的图片)捆绑进HTML/CSS/图片中。
相关推荐
"程序性能优化-并行" 程序性能优化是指通过对程序的架构、算法和实现进行优化,以提高程序的执行速度和效率。在并行程序中,性能优化尤为重要,因为并行程序的执行时间可能会受到多种因素的影响,例如处理器的速度...
6. 字体性能优化:为减少Overhead,开发者可以采用字体子集化,仅加载必要的字符,或者使用Web字体服务来按需加载字体,从而降低内存占用和加载时间。 7. 字体缓存策略:智能的字体缓存策略可以降低Overhead。例如...
- **Parallel Overhead**:并行处理带来的额外开销,如任务调度、同步和通信成本。 - **Scalability**:随着处理器数量增加,系统性能的提升程度。 并行计算机的存储结构可以是共享内存、分布式内存,或者是两者的...
3. HikariCP:一个高性能的连接池,被设计为JDBC4.1规范下的“零-overhead”生产级连接池。它的速度非常快,且稳定性好。 4. Druid:阿里巴巴开源的数据库连接池实现,除了基本的连接池功能外,还提供了监控、SQL...
《Overhead & Profit Claims》这篇文章深入探讨了办公室间接费用(Head Office Overhead)与利润索赔的问题,并特别提到了在处理这类索赔时常见的Hudson's公式。本文将详细解析这一主题,帮助读者更好地理解如何合理...
总的来说,MySQL数据连接池是提高系统性能、优化数据库访问的关键技术之一,它通过有效的管理数据库连接,实现了资源的高效利用,降低了系统的开销,提升了整体应用的响应速度和并发处理能力。在开发过程中,选择...
这样可以显著减少数据库连接的生命周期,从而节省资源并提高性能。 Apache DBCP是Apache的一个开源项目,提供了一个基础的数据库连接池实现。它依赖于Jakarta Pool库来管理连接。使用DBCP,你需要配置一个...
3. HikariCP:被誉为“最快的JDBC连接池”,它的设计目标是提供零-overhead的性能和极低的资源占用。HikariCP具有快速的连接验证、自动定时检查过期连接以及优秀的性能监控功能。 4. Druid:阿里巴巴开源的数据库...
HikariCP由Brett Wooldridge创建,其设计目标是提供一个零-overhead(零开销)的JDBC连接池,旨在解决传统连接池存在的性能问题。HikariCP的名字来源于日语“光”,寓意其速度之快。在v5.1.0版本中,HikariCP继续...
IEC 61854 2020 Overhead lines–Requirements and tests for spacers
《深入理解Overhead Profiler:开源的C/C++性能分析利器》 在现代软件开发中,性能优化是一项至关重要的任务,特别是在多线程环境中。为了有效地优化程序,开发者需要了解哪些部分消耗了最多的资源,这正是Overhead...
然而,在实际应用中,工作流系统的性能往往受到多种因素的影响,特别是所谓的“工作流开销”(Workflow Overhead)。工作流开销是指在执行工作流过程中所产生的额外时间或资源消耗,这些开销可能来自多个方面,例如...
而JDBC连接池是一种管理资源的技术,它能有效地管理和复用数据库连接,提高系统性能并减少系统资源的消耗。在Java应用中,常见的连接池实现有DBCP、C3P0、HikariCP、Druid等。 标题"完美的java jdbc连接池实例.zip...
To avoid the large overhead in accessing system-wide global clock, we opt to use local per-core clocks that incur much less access overhead. We then propose techniques to resolve skews among local ...
在IT领域,尤其是在嵌入式系统与高性能计算中,低延迟输入/输出(I/O)操作与快速的产品上市时间往往是相互矛盾的目标。然而,Tilera的Zero Overhead Linux(ZOL)机制提供了一个独特的解决方案,它允许软件开发者在...
数据库连接池是Web开发中一个至关重要的概念,它在处理数据库交互时扮演着优化资源管理和提高性能的角色。在高并发的环境下,频繁地创建和关闭数据库连接会消耗大量的系统资源,甚至可能导致数据库服务过载。数据库...
3. 行人分割与跟踪:在特征检测的基础上,算法需要将行人从背景中分离出来,并进行跟踪。这一步可能涉及连通组件分析、卡尔曼滤波、光流法等技术,确保个体在连续帧间的连贯性。 4. 人数计数:当行人被成功识别并...
在优化并行程序的过程中,LogP模型成为一个重要的分析和设计工具,它由四个主要参数:延迟(latency)、开销(overhead)、带宽(bandwidth)和处理器数量(number of processors)组成,用以描述分布式存储系统的...
"Parallel Shortest Path Algorithms:最短路径并行算法" Parallel Shortest Path Algorithms(最短路径并行算法)是计算机科学和信息技术领域中的一种重要算法。该算法旨在解决大规模图形的单源最短路径问题...
为了优化I/O性能,数据库管理员需要考虑如何合理布局数据,例如将不同I/O需求的文件分配到不同的存储设备,平衡I/O负载,使用并行I/O访问,以及规划表空间的分布。此外,磁盘阵列技术,如RAID(独立磁盘冗余阵列),...