`

YaHoo Web性能优化的14条法则(上)

阅读更多

周末翻读《High Performance web site 》以及 YaHoo! Web性能优化的14条法则 感触颇深。

重新拜读下这14条法则,概括了前端优化的方方面面。

Web应用性能优化黄金法则:先优化前端程序(front-end)的性能,因为这是80%或以上的最终用户响应时间的花费所在。

法则1. 减少HTTP请求次数

80%的最终用户响应时间花在前端程序上,而其大部分时间则花在各种页面元素,如图像、样式表、脚本和Flash等,的下载上。减少页面元素将会减少HTTP请求次数。这是快速显示页面的关键所在。
一种减少页面元素个数的方法是简化页面设计。但是否存在其他方式,能做到既有丰富内容,又能获得快速响应时间呢?以下是这样一些技术:

Image maps组合多个图片到一张图片中。总文件大小变化不大,但减少了HTTP请求次数从而加快了页面显示速度。该方式只适合图片连续的情况;同时坐标的定义是烦人又容易出错的工作。
CSS Sprites是更好的方法。它可以组合页面中的图片到单个文件中,并使用CSS的background-image和background-position属性来现实所需的部分图片。
Inline images使用data: URL scheme来在页面中内嵌图片。这将增大HTML文件的大小。组合inline images到你的(缓存)样式表是既能较少HTTP请求,又能避免加大HTML文件大小的方法。
Combined files通过组合多个脚本文件到单一文件来减少HTTP请求次数。样式表也可采用类似方法处理。这个方法虽然简单,但没有得到大规模的使用。10大美国网站每页平均有7个脚本文件和2个样式表。当页面之间脚本和样式表变化很大时,该方式将遇到很大的挑战,但如果做到的话,将能加快响应时间。

减少HTTP请求次数是性能优化的起点。这最提高首次访问的效率起到很重要的作用。据Tenni Theurer的文章Browser Cache Usage – Exposed!描述,40-60%的日常访问是首次访问,因此为首次访问者加快页面访问速度是用户体验的关键。

应用:
实际应用中我们可以看到最常用的是使用CSS控制Images的显示,这样减少了http的请求数,另外针对ajax的http请求进行检测和精简,尽可能提高性能。

法则2. 使用CDN(Content Delivery Network, 内容分发网络)

用户离web server的远近对响应时间也有很大影响。从用户角度看,把内容部署到多个地理位置分散的服务器上将有效提高页面装载速度。但是该从哪里开始呢?
作为实现内容地理分布的第一步,不要试图重构web应用以适应分布架构。改变架构将导致多个周期性任务,如同步session状态,在多个server之间复制数据库交易。这样缩短用户与内容距离的尝试可能被应用架构改版所延迟,或阻止。
我们还记得80-90%的最终用户响应时间花在下载页面中的各种元素上,如图像文件、样式表、脚本和Flash等。与其花在重构系统这个困难的任务上,还不如先分布静态内容。这不仅能大大减少响应时间,而且由于CDN的存在,分布静态内容非常容易实现。
CDN是地理上分布的web server的集合,用于更高效地发布内容。通常基于网络远近来选择给具体用户服务的web server。
一些大型网站拥有自己的CDN,但是使用如Akamai Technologies, Mirror Image Internet, 或 Limelight Networks等CDN服务提供商的服务将是划算的。在Yahoo!把静态内容分布到CDN减少了用户影响时间20%或更多。切换到CDN的代码修改工作是很容易的,但能达到提高网站的速度。

应用:
这个的应用在google的数据分发网络的架构中体现比较深,所以这与data centre位置,CDN供应商等有着密切的关系。

法则3. 增加Expires Header

网页内容正变得越来越丰富,这意味着更多的脚本文件、样式表、图像文件和Flash。首次访问者将不得不面临多次HTTP请求,但通过使用Expires header,您可以在客户端缓存这些元素。这在后续访问中避免了不必要的HTTP请求。Expires header最常用于图像文件,但是它也应该用于脚本文件、样式表和Flash。
浏览器(和代理)使用缓存来减少HTTP请求的次数和大小,使得网页加速装载。Web server通过Expires header告诉客户端一个元素可以缓存的时间长度。
如果服务器是Apache的话,您可以使用ExpiresDefault基于当期日期来设置过期日期,如:
ExpiresDefault “access plus 10 years” 设置过期时间为从请求时间开始计算的10年。
请记住,如果使用超长的过期时间,则当内容改变时,您必须修改文件名称。在Yahoo!我们经常把改名作为release的一个步骤:版本号内嵌在文件名中,如yahoo_2.0.6.js。

应用:
这个在日常性能调优中用得最多,它是与之后的Etags的设置有着类似的作用,主要是在客户端对缓存的利用,避免不必要的http请求。

法则4. 压缩页面元素

通过压缩HTTP响应内容可减少页面响应时间。从HTTP/1.1开始,web客户端在HTTP请求中通过Accept-Encoding头来表明支持的压缩类型,如:
Accept-Encoding: gzip, deflate.
如果Web server检查到Accept-Encoding头,它会使用客户端支持的方法来压缩HTTP响应,会设置Content-Encoding头,如:Content-Encoding: gzip。
Gzip是目前最流行及有效的压缩方法。其他的方式如deflate,但它效果较差,也不够流行。通过Gzip,内容一般可减少70%。如果是Apache,在1.3版本下需使用mod_gzip模块,而在2.x版本下,则需使用mod_deflate。
Web server根据文件类型来决定是否压缩。大部分网站对HTML文件进行压缩。但对脚本文件和样式表进行压缩也是值得的。实际上,对包括XML和JSON在内的任务文本信息进行压缩都是值得的。图像文件和PDF文件不应该被压缩,因为它们本来就是压缩格式保存的。对它们进行压缩,不但浪费CPU,而且还可能增加文件的大小。
因此,对尽量多的文件类型进行压缩是一种减少页面大小和提高用户体验的简便方法。

应用:
由于HTTP协议的缘故,压缩页面元素已经成为有效提高性能的一种方式,这在之前的HTTP SERVER调优 中也有相应的介绍。
并且我们对js,ajax脚本也能进行相应的压缩,加快传输速率。

法则5. 把样式表放在头上

我们发现把样式表移到HEAD部分可以提高界面加载速度,因此这使得页面元素可以顺序显示。
在很多浏览器下,如IE,把样式表放在document的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素,那用户只能看到空白页了。Firefox不会阻止显示,但这意味着当样式表下载后,有些页面元素可能需要重画,这导致闪烁问题。
HTML规范明确要求样式表被定义在HEAD中,因此,为避免空白屏幕或闪烁问题,最好的办法是遵循HTML规范,把样式表放在HEAD中。

应用:
这点经常被性能组忽略,这一点与法则6经常一起使用来提高页面的显示正确性和显示速率。

法则6. 把脚本文件放在底部

与样式文件一样,我们需要注意脚本文件的位置。我们需尽量把它们放在页面的底部,这样一方面能顺序显示,另方面可达到最大的并行下载。
浏览器会阻塞显示直到样式表下载完毕,因此我们需要把样式表放在HEAD部分。而对于脚本来说,脚本后面内容的顺序显示将被阻塞,因此把脚本尽量放在底部意味着更多内容能被快速显示。
脚本引起的第二个问题是它阻塞并行下载数量。HTTP/1.1规范建议浏览器每个主机的并行下载数不超过2个。因此如果您把图像文件分布到多台机器的话,您可以达到超过2个的并行下载。但是当脚本文件下载时,浏览器不会启动其他的并行下载,甚至其他主机的下载也不启动。
在某些情况下,不是很容易就能把脚本移到底部的。如,脚本使用document.write方法来插入页面内容。同时可能还存在域的问题。不过在很多情况下,还是有一些方法的。
一个备选方法是使用延迟脚本(deferred script)。DEFER属性表明脚本未包含document.write,指示浏览器刻继续显示。不幸的是,Firefox不支持DEFER属性。在IE中,脚本可能被延迟执行,但不一定得到需要的长时间延迟。不过从另外角度来说,如果脚本能被延迟执行,那它就可以被放在底部了。

法则7. 避免CSS表达式

CSS表达式是功能强大的(同时也是危险的)用于动态设置CSS属性的方式。IE,从版本5开始支持CSS表达式,如backgourd-color: expression((new Date()).getHours()%2?”#B8D4FF”:”#F08A00”),即背景色每个小时切换一次。
CSS表达式的问题是其执行次数超过大部分人的期望。不仅页面显示和resize时计算表达式,而且当页面滚屏,甚至当鼠标在页面上移动时都会重新计算表达式。
一种减少CSS表达式执行次数的方法是一次性表达式,即当第一次执行时就以明确的数值代替表达式。如果必须动态设置的话,可使用事件处理函数代替。如果您必须使用CSS表达式的话,请记住它们可能被执行上千次,从而影响页面性能。

应用:
主要是对动态设置CSS属性的一些js的检查,尽可能少CSS表达式的执行次数。

 

转自:http://www.futurehandw.com/author/jason_woo/

分享到:
评论

相关推荐

    YAHOO网页加速的14条优化法则

    ### YAHOO网页加速的14条优化法则 ...以上四种法则只是YAHOO提出的14条网页加速优化法则中的前四条,但已经包含了网页性能优化的核心思想和技术手段。通过综合运用这些技术,可以大幅度提升网页的加载速度和用户体验。

    web前端性能优化进阶路

    可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化黄金法则,以及大名鼎鼎的优化大师SteveSouders。本文并非一篇讨论性能优化技术方法的文章,而更多的是对中文站搜索List页面持续两年多...

    Web前端性能优化WPO:性能优化的三个阶段

    可以说,这个领域并不缺乏成熟技术理论和技术牛人:例如Yahoo的web站点性能优化黄金法则,以及大名鼎鼎的  Web前端性能优化WPO,相信大多数前端同学都不会陌生,在各自所负责的站点页面中,也都会或多或少的有过...

    自动化运维和性能优化实践.pdf

    性能优化实践主要包括数据库性能优化,如逻辑读取、物理读取、重做写入、执行次数等方面的监控和调整,以及避免全表扫描,提高SQL执行效率。此外,通过使用APM(Application Performance Management)分析平台,可以...

    腾讯面试必备

    前端性能优化是提高用户体验的关键,Yahoo的34条前端优化法则能够指导开发者进行前端性能的优化工作。 数据库缓存是提高数据库操作效率的重要手段,例如memcached的使用能够减轻数据库的压力并提高数据访问速度。 ...

    ITeye新闻月刊 - 2013年10月 - 总第68期

    - **打造优秀APP的9条黄金法则**:文章分享了如何设计和开发出成功的移动应用的策略,包括用户体验、功能设计、性能优化等方面的指导。 - **InMobi CEO:App怎么推广最有效?**:讨论了移动应用的营销策略,强调了...

    NoSQL数据库笔谈

    - 缓存式的Web应用程序架构:介绍如何构建基于Memcached的Web应用。 - 性能测试:评估Memcached的性能指标。 **2. dbcached** - 与Memcached对比,探讨其差异和应用场景。 **3. 列存系列** - **Hadoop之Hbase**:...

    NoSQL数据库学习教程.pdf

    性能Nuclear是指使用Nuclear来实现分布式系统的性能优化。 两个设计上的 Tips是指分布式系统的设计上的Tips和建议。 Voldemort是指使用Voldemort来实现分布式系统的可扩展性。 Dynomite是指使用Dynomite来实现...

Global site tag (gtag.js) - Google Analytics