上个月,Yahoo!优异性能(Yahoo!'sExceptionalPerformance)开发团队成员StoyanStefanov出席了蒙特利尔的2008魁北克PHP会议演讲。他提供了他们团队最新的研究成果和提高网页性能规则20条。在早先的高性能网页开发14条军规已经让大家耳熟能详,此次新增的20条更加全面,覆盖了服务器端、cookies、页面内容、JavaScript、CSS、图片、移动手机应用这七大类别。以下内容就是根据这二十条结合个人在实际开发中的理解所做的全面解读。希望对大家开发有所助益。
阅读指导:
1.每条规则后会指明是针对上述所说的七大类别中哪个类别的优化。
2.文中提到的一些工具在文后附注中会提供简要说明。
3.文中经常提到“组件”这个词,这个词不同于我们程序开发中常提到的组件概念。本文中提到的“组件”特指嵌在HTML页面中图片、JavaScript脚本、CSS等静态文件。
一、尽早清除缓冲区[服务器端]
假如用户请求一个页面,而这个页面在后端服务器需要花200至500毫秒乃至更长时间才能生成最终HTML页面,这时候用户浏览器处于较长时间的、等待页面数据返回的空闲状态,用户体验不会很好。此时可以根据页面内容长短做适当分隔,将先生成的页面局部HTML缓冲内容提前发送到客户端,不必让服务器消耗内存缓冲完整个庞大的页面内容后再行输出。这种方法有益于处理后端负荷大而前端负荷轻的页面。
在HTML页面的head标签位置后是清除缓冲的好位置,因为HTML的head标签可以包括CSS和JavaScript文件,对于浏览器而言获取页面显示与后端服务器处理并行的效果较好。在PHP中有一个函数flush(),它可以发送请求页面的局部HTML代码给浏览器,以便浏览器能先取得页面已经生成的部分HTML,同时后端服务器继续忙于处理生成页面余下的HTML。以下以此函数做个示例:
...<!--css,js-->
</head>
<!--注意此处flush()是放在了head标签位置后面-->
<?phpflush();?>
<body>
...<!--content-->
其他语言也有类似语法,如ASP.NET和ASP中的Response.Flush()。
注意:在实际Web开发中,尽量减少HTTP请求次数是优化的重要方面,这条基本原则是早先14条和新增20条中很多规则的制订基础,实际上它也是14条规则中第一条也是非常重要的一条规则,但是使用尽早清除缓冲语句会增加一个页面的HTTP请求次数,这无疑是一个矛盾,因此请注意本条规则的适用范围,不要滥用它。
二、使用GET方法的AJAX请求[服务器端]
这个容易理解一些。AJAX经常要用XMLHttpRequest,但是它的POST方法在浏览器中完成需要执行两步:首先发送信息头,然后才是发送数据;而GET方法只用一个TCP数据包传递(cookies信息例外)即可,减少了一个步骤,速度会快些。
另外根据HTTP规范,GET方法就是为获取信息而生的。因此仅在请求数据而不是发送数据给服务器端存储时,使用GET方法很有意义。
要注意的是,IE中URL允许最大允许长度是2K,用GET方法发送数据时注意2K的这个限制。
三、后加载组件[页面内容]
使用该方法的意义在于:如果某个页面内容丰富多彩的话,在浏览器加载显示它时速度就不会很快。使用后加载组件的方法可以通过延迟加载一些隐藏内容来保证浏览器优先显示初始页面。
要做到这一点必须仔细观察自己的页面并且问自己:“解释生成一个完整页面,什么部分内容是开始加载时绝对必须显示的?”清楚了这个问题,那么那些余下内容和组件就可以采用后加载方法延迟生成。这样会大大加快页面显示速度。
这个技巧通常是JavaScript通过处理页面加载时的onload事件完成。例如,使用JavaScript代码和库去执行拖放动态效果操作时,这些操作可以延迟,因为拖动页面上元素的操作只能等初始页面生成完后才能发生。页面中的隐藏内容也适合用后加载方式,因为只有页面加载完毕用户才能操作决定是否显示该内容。
Yahoo!网站的首页内容繁多,观察处于隐藏状态下的内容,这些内容通常在一些选项卡一样的标签页当中,只有点击后才会加载。
只要明白该规则的优化要点后相信大家可以通过JavaScript做出自己的具体实现。Yahoo!提供了两个用于实现后加载方法的工具:
◆YUIImageLoader:可以延迟图片显示
◆YUIGetutility:它可以在页面加载完成后把JavaScript和CSS资源绑定到DOM上去。
以上的工具是Yahoo!的YUI库提供。
四、预加载组件[页面内容]
从文字上看预加载组件与后加载组件似乎作用相反,但实际上二者目标是完全不同的。通过预先加载组件可以充分利用浏览器的空闲时间,并且可以请求未来页面需要的组件。在这种情况下,当用户访问下一个页面时,你已经提前让大多数组件保存在缓存中,用户加载这个页面就会非常快。
预加载类型有下列三种:
1.无条件预加载
onload事件一触发,就要马上取回一些指定的组件。可以检查google.com首页中onload事件中请求Sprite图片的例子(注:什么是Sprite图片,请参看第十六条规则)。在这个例子可以看出这个sprite图片www.google.com/images/nav_logo3.png在google.com首页本身并不需要,但它会在随后用户搜索生成的结果页面中需要。
2.条件预加载
根据用户操作预测用户下一步操作的方向,并据此做预加载。例如,search.yahoo.com中,在输入框中刚键入几个字符后,就会看到页面对你键入的词做出合理推测,推出几个可能要搜索的实际关键词。此方法目前谷歌(google.cn)也在使用。
3.提前预加载
在将重新设计的网站页面发布前用此法较好。页面重新设计后常会有这样的反馈:“新站点太酷了,就是比以前慢”。原因在于用户访问旧站点是全缓存的,但新站点还没有缓存过。这时可以在发布新设计前就预加载一些新站点组件,这可以减少没有缓存的副作用。可以利用用户访问旧站点时浏览器空闲的时间请求新站点要使用的图片、脚本等。
五、减少DOM元素数量[页面内容]
一个复杂的页面意味着要请求下载的字节数更多,也意味着用JavaScript访问DOM速度更慢。
如何尽量减少已有页面的DOM元素数量呢?一个重要的思路就是不要滥用表格table和div。很多人习惯用一些网页编辑软件去设计页面,这样会导致大量嵌套的表格或在使用语义不合法的标记。使用div要仅当它在语义上有意义时才使用它,有些开发者使用它仅仅是因为它可以被浏览器解释生成一个新行。
Yahoo!提供了一个避免这些问题的方法——使用YUICSS工具。grids.css有助于整体布局设计,fonts.css和reset.css有且于清除浏览器的默认格式设置。这些工具可以在Yahoo!的YUI页面中去找。
DOM元素的数量可在Firebug的Console上键入document.getElementsByTagName('').length得到。
DOM元素不超过多少才适当呢?这可以通过检查一些有良好设计的页面来感觉比较。如Yahoo!主页访问量相当大,它的数量在700个元素(HTML标签)以下。
六、分隔组件到多个域中[页面内容]
对终端用户响应时间影响最大的就是所请求页面所含组件数量。只要浏览器缓存为空,下载每个组件需要占用额外的HTTP请求,只有缓存满时才可能不占用。
HTTP/1.1规范中建议浏览器对每一个主机名允许并发下载两个组件。默认状态下,InternetExplorer和Firefox都符合这个规范。注意:IE8.0默认允许6个并发请求。
许多网页中所有组件都从同一主机名中下载,这时不仅响应时间受并发线程数限制,同时也受该服务器CPU和带宽限制。把页面组件分布在两个主机名中,整体响应时间就会快2倍,CPU和带宽消耗也会得以分担。
七、尽量减少HTML标签iframe的使用数[页面内容]
iframe允许在父文档内插入一个HTML文档。要想高效使用iframes,理解它的工作方式很重要。
使用iframe有如下好处:
◆有助于减慢显示第三方标记和广告内容。
◆是个安全的Sandbox。
◆能并发下载脚本。
但同时也有弊端:
◆即使iframe内的HTML文档内容为空,消耗也比较高。
◆会阻止页面的onload事件
◆非语义的
八、避免404页面[页面内容]
如果做了一个HTTP请求然后得到一个无用的响应页面,不仅完全不必要而且会降低用户体验。404页面就是在没有发现指定资源时返回的页面。
一些站点提供了有益的404提示,对用户体验有好处,但这毕竟浪费了服务器资源。当链接一个外部JavaScript文件,而它又出了404错误,这尤其糟糕。首先,因为这个下载有问题会阻止并发下载;其次,即使有错浏览器仍然会尽力解析404返回的内容,看看有无JavaScript代码,尽力查找里面可用代码。
文/邹建强
分享到:
相关推荐
为了实现这一目标,业界总结了一套高性能网页开发的新规则,本文将对这20条规则中的前三条进行详细解析。 首先,让我们讨论“尽早清除缓冲区”的重要性。当用户访问网页时,他们期望内容能够快速加载,而不是长时间...
Drools是由Jboss公司开发的一款高性能开源规则引擎,其核心优势在于完整实现了RETE算法,同时提供了强大的开发支持和自然语言规则描述能力。Drools通过其DSL(领域特定语言),使得非技术人员也能理解并参与规则的...
### 高性能网站建设指南知识点详解 #### 一、引言:高性能网站的重要性 - **定义高性能网站**:高性能网站指的是加载速度快、响应迅速且用户体验良好的网站。随着互联网技术的发展,用户对网站性能的要求越来越高...
本教程将详细介绍如何在Java项目中集成Drools5,包括依赖配置、规则加载、会话创建与执行,以及如何调试和优化规则引擎性能。 总之,Drools5是一个功能强大的规则引擎,通过理解和掌握其核心概念和开发方法,开发者...
本文将详细介绍Allegro 16.6中的约束规则设置,包括基本约束规则设置和高级约束规则设置。 ### 一、基本约束规则设置 #### 1. 线间距设置 线间距设置是指在PCB设计中定义不同信号线路之间的最小间距。这是为了...
《高性能计算之并行编程技术》是一本详细介绍MPI(Message Passing Interface,消息传递接口)并行程序设计方法的专业书籍。该书旨在为读者提供从基础知识到高级应用的全面指导,尤其适合高校本科生、非计算机专业的...
下面将对书中涉及的一些关键知识点进行详细介绍。 ### 1. 遵循命名规范 命名是编程中最基础也是最重要的部分之一。良好的命名能够使代码更加易于理解和维护。书中建议采用有意义的名称,避免使用缩写或过短的名称...
以下将详细介绍CSS网页模板及其相关知识点。 1. **CSS基础**:CSS是一种样式表语言,用于描述HTML或XML(包括如SVG、MathML等各种XML方言)文档的外观和格式。CSS允许将样式信息与结构信息分离,使得内容的呈现方式...
6. Web应用程序:使用web workers和离线存储,构建响应式、高性能的Web应用程序,如离线版的邮件客户端或日历应用。 7. 图像拖放:通过drag and drop API,创建拖放功能,如图片上传、文件管理等。 8. 表单增强:...
**阿里云专有云企业版高性能时间序列数据库TSDB开发指南** 阿里云的高性能时间序列数据库TSDB(Time Series Database)是专为企业级用户设计的一款专门处理时间序列数据的数据库系统。时间序列数据库通常用于存储和...
《Android开发应用实战详解》是一本深度探讨Android应用程序开发的专著,旨在为开发者提供全面且深入的指导。这本书详细阐述了Android平台的基础知识、核心组件以及实际开发中的技巧和最佳实践,帮助读者从入门到...
5. **规则引擎集成**:详细介绍如何将规则引擎集成到现有的应用程序环境中。 6. **规则部署**:指导如何将规则集部署到生产环境,并确保规则的安全性和可控性。 #### 八、教程与演示 ILOG JRules提供了丰富的教程和...
Drools的核心是一个高性能的规则引擎,它支持决策表、流程管理等功能,并且能够很好地与Java应用程序集成。 #### 二、Rete算法详解 Rete算法是一种高效的模式匹配算法,由Charles L. Forgy在1974年提出。这一算法...
### Java编程31条规则详解 #### 规则1:命名规范与静态常量 - **知识点**:Java中类名、方法名、字段名的命名应遵循驼峰式命名法,如`ThisIsAClassName`。静态常量应全部大写,用下划线分隔单词,如`JAVA_PACKAGE`...
1. **HTML基础**:HTML(HyperText Markup Language)是网页设计的基础,书中详细介绍了HTML的语法规则,包括标签、属性、链接、图像、表格、框架等元素的使用方法。 2. **CSS样式表**:CSS(Cascading Style ...
《D5Rpg网页游戏开发套件详解及应用实践》 D5Rpg是一款专为网页游戏开发者设计的高效开发工具,它集成了丰富的功能和便捷的开发环境,旨在简化网页游戏的制作流程,提高开发效率。这款开发套件以其易用性、灵活性和...
在详细介绍Nginx取代Apache作为高性能Web服务器之前,先来阐述一下这两个Web服务器软件的基础知识以及它们之间的主要区别。Apache是目前使用最广泛的Web服务器软件之一,它是一个开源项目,从1995年就开始活跃在Web...
**Windows高性能大并发IOCP详解** IOCP,即I/O完成端口(Input/Output Completion Port),是Windows操作系统提供的一种高效、多线程处理I/O请求的机制。它被广泛应用于网络服务器、数据库系统以及需要处理大量并发...
这些评分基于22条高性能网页规则,规则按照重要性排序。每个规则都有相应的评分和建议,例如: - 如果页面与某一条规则无关,则显示"N/A"。 - 点击每一条规则都会给出改进建议,帮助开发者了解如何优化。 ##### 2....