针对目前接手的web前端的性能测试,一时间不知道从什么地方入手,然后经过查找资料,发现其实还是蛮简单的。
前端性能测试对象:
HTML、CSS、JS、AJAX等前端技术开发的Web页面
影响用户浏览网页速度的因素:
服务端数据返回、网络传输、页面渲染等
前端性能测试目的:
计算出包含页面渲染、网络传输以及服务器端解析等综合因素在内的加载时间等指标,对该页面性能进行评估分析,找出影响性能的主要因素和瓶颈,并在此结果的基础上,给出一定的优化建议和解决方案,从而提升用户体验
YSlow/PageSpeed:
通过网页JS/CSS/Image数及请求数量、请求类型、缓存等方面的静态分析
DynaTrace:
支持IE,不仅可以显示所有请求和文件在网络中传输的时间,还会记录浏览器Render、CPU消耗、JavaScript解析和运行情况等详细的动态分析
7个类别,总共35项指标
u Content
u Server
u Cookie
u CSS
u JavaScript
u Images
u Mobile
u Content:
u Make fewer HTTP requests
u Reduce the number of DOM elements
u Avoid redirects
u Make AJAX cacheable
u Avoid HTTP 404 (Not Found) error
u Reduce DNS lookups
u Postload Components
u Preload Components
u Split Components Across Domains
u Minimize Number of iframes
u COOKIE:
u Use cookie-free domains for components
u Reduce cookie size
u CSS:
u Avoid CSS expressions
u Minify JavaScript. and CSS
u Put CSS at top
u Make JavaScript. and CSS external
u Avoid AlphaImageLoader filter
u Remove duplicate JavaScript. and CSS
u Choose Over @import
u IMAGES:
u Make favicon small and cacheable
u Do not scale p_w_picpaths in HTML
u Optimize Images
u Optimize CSS Sprites
u JAVASCRIPT:
u Minify JavaScript. and CSS
u Make JavaScript. and CSS external
u Put JavaScript. at bottom
u Remove duplicate JavaScript. and CSS
u Minimize DOM Access
u Develop Smart Event Handlers
u SERVER:
u Compress components with gzip
u Configure entity tags(ETags)
u Use a Content Delivery Network(CDN)
u Use GET for AJAX requests
u Add Expires or Cache-Control Header
u Flush Buffer Early
u Avoid Empty Image src
u Mobile:
u Keep Components Under 25 KB
u Pack Components Into a Multipart Document
Make fewer HTTP request
更少的http请求;页面中尽量少的引用外部静态资源、JS、CSS以及图片等,方法如使用CSS Sprites整合图片、合并CSS文件(不需要划分为什么色彩样式、布局样式、文字样式之类的)、合并JS文件
计算公式:
8×{100-[4×(JS文件数-3)+4×(CSS文件数-2)+3×(CSS背景图连接数-6) ] }
Avoid URL redirects
避免重定向;重定向增加了额外的浏览器向服务器的请求,这里有一种现象常常会被开发者所忽略,这种现象发生在当URL本该有斜杠(/)却被忽略掉时,这时候会返回一个301的状态码,然后浏览器重新发起一次请求,这其中就浪费掉了时间
计算公式:
4×(100-10×Redirect个数)
Make AJAX cacheable
设置AJAX的缓存;当前AJAX的应用越来越广泛,AJAX的信息读取是异步的,这也表示用户不一定会等待这异步的响应,为避免重复的AJAX请求,设置缓存是优化性能的一个好方法
计算公式:
4×(100-5×未缓存或者缓存时间不足3600秒的AJAX请求个数)
Avoid HTTP 404 (Not Found) error
避免404错误页面的出现。不管从服务器资源还是用户体验上来说,都是不好的
计算公式:
4×(100-5×状态为404的连接个数)
Reduce DNS lookups
减少DNS查找;不要把同一个网站的内容分散在不同的服务器上,比如说,一个图片站,因为空间大小的关系把某一部分图片放在了另一个服务器上,那么这一部分的图片在浏览的时候就会慢很多
计算公式:
3×[100-5×(域名数-4)]
Use cookie-free domains
使用免费cookie域名,即这个域名不会产生cookie;当浏览器向服务器请求一张静态的图片前,会先发送同域名下的cookie,服务器对于这些cookie不会做任何处理,因此它们只是在毫无意义的消耗带宽,所以你应该确保对于静态内容的请求是无cookie的请求,需要把静态资源放在一个二级域名上
计算公式:
3×(100-5×不满足cookie free要求的链接个数)
Reduce cookie size
减小cookie的大小;cookie一般用于个人信息身份验证等用途,cookie信息在HTTP headers中传递与服务端和浏览器间,所以cookie的大小对用户响应时间非常重要
计算公式:
3×[cookie大小不超过1000字节?100∶(99-10×页面cookie的大小/1000) ]
Avoid CSS expressions
避免CSS表达式;CSS表达式的执行次数是远远多于我们想象的,往往会严重地影响性能,并且只支持IE(IE5开始支持,IE8不再支持)
计算公式:
3×[不存在CSS表达式?100: (90-2×CSS表达式数目) ]
Minify JavaScript. and CSS
压缩JavaScript和CSS;容量小页面加载速度自然就快了
计算公式:
4×(100-10×未精简的CSS与JS个数)
Put CSS at top
将CSS放在页面顶部;CSS作为解释型语言,如果CSS在上方的话,那么浏览器解析结构的时候,就已经可以对页面进行渲染,从而提升用户体验
计算公式:
4×[body中没有CSS连接? 100∶(99-10×body中的CSS连接数) ]
Make JavaScript. and CSS external
使JavaScript和CSS为独立文件;把JS和CSS写在HTML文件中,可以减少2次请求,但同时也增大了页面大小,并且每次请求HTML都需要重新下载JS和CSS,严重影响性能,而JS和CSS可以缓存,重新访问就不存在多余的2次请求
Avoid AlphaImageLoader filter
避免AlphaImageLoader滤镜的使用;使用滤镜的目的是为了解决IE7以下版本中对于PNG图片透明度的问题,这种机制阻碍和延迟了图片的下载和页面渲染,增加内存的消耗,严重影响性能,可以用PNG8即256色PNG来处理,或者使用Hack-filter使IE7及以上版本也不会有问题
计算公式:
4×[100-(2×使用hack的filter个数+5×未使用hack的filter个数) ]
Remove duplicate JavaScript. and CSS
去除重复的JavaScript和CSS;
计算公式:
4×[100-5×(重复的JavaScript个数+重复的CSS个数) ]
Make favicon small and cacheable
使图片尽量小并使用缓存;不管怎样都会请求favicon.ico,在下载其它组件之前都会先下载favicon.ico,所以favicon.ico最好能在1K以内,并设置足够长的Expires header
计算公式:
2×[100-(favicon不可缓存或缓存时间小于3600秒? 5∶0)-(favicon大小超过2000字节? 5∶0)]
Do not scale p_w_picpaths in HTML
不要对图片进行缩放;如只需要显示100*100的图片,就只需要100*100的图片,而不要使用500*500的图片,这是一种对服务器资源的浪费
计算公式:
3×(100-5×在HTML代码中设定width和height的图片数)
Put JavaScript. at bottom
将JavaScript放在页面底部;目的是为了防止JS的执行阻碍页面的下载,同时为了避免同其它资源的并行下载,一般的处理办法是页面头部引入JS链接,页面底部执行JS脚本程序,这样可以实现最 大的下载并行,页面加载初期做的事,最好只有下载,HTML的下载,CSS的下载,JS的下载,等下载完成后再去实现页面渲染,JS脚本运行
计算公式:
4×(100-5×head中的JavaScript连接数)
Compress components with gzip
使用gzip压缩文件;Gzip的思想就是把文件先在服务器端进行压缩,然后再传输,在客户端再进行解压,减小网络传输
计算公式:
8×[100-11×(文件大小大于500字节且未使用gzip的连接个数)]
Configure entity tags(Etags)
Etag是服务器告诉浏览器缓存,缓存中的内容是否已经发生变化的一种机制,通过Etag浏览器就可以知道现在的缓存中的内容是不是最新的,是否需要重新从服务器上下载
计算公式:
2×(100-11×未使用Etags的连接个数)
Use a Content Delivery Network(CDN)
使用CDN;CDN是一个分布于多个地方的服务器集群,为了更有效地向用户分发数据,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的 服务器内,通过DNS负载均衡的技术,判断用户来源就近访问服务器取得所需的内容
计算公式:
6×(100-10×未使用CDN的连接个数)
Add Expires headers
设置Expires Header可以将脚本、 样式表、图片、Flash等缓存在浏览器的Cache中,让用户通过本地缓存来更快的访问网站
计算公式:
10×[100-11×(Expire时间小于172800秒的连接个数) ]
Use GET for AJAX requests
用GET获取AJAX请求;POST方式在浏览器的处理分2步:第1步发送headers,第2步发送数据,所以最好使用GET方式,只发送一个TCP包。
计算公式:
3×(100-5×请求方式不是GET的AJAX个数)
Keep Components under 25K
这个约束主要针对iPhone客户端,iPhone无法缓存大于25K的资源文件
主要指标:
First Impression Time/Onload Time/Fullyload Time/Roundtrips(KPI’s)、Caching, Network, JavaScript. and Server-Side
计算公式:
KPI’s*0.6 + (Caching + Network + JavaScript. + Server-Side)*0.1
First Impression Time
这个时间等于在浏览器地址栏输入URL按回车到用户看到网页的第一个视觉标志为止,第一个视觉标志是浏览器的第一个绘制活动,浏览器绘制内容的起始时间取决于原始的HTML文档,不同的策略有不同的最佳实践,例如Google会先下载一个极简的页面提供快速的第一视觉呈现,在onLoad后再延迟加载更多 的内容,有时甚至是用户已经开始与网页交互了才加载剩下的内容
Onload Time