一次web性能优化简介。
前几天在日常发布的时候,测试人员对于一个页面的性能测试中,发现请求一个页面耗时竟然达到了1.34s,而且其他几个系统也有几个耗时页面。测试人员对于这几个页面做了压力测试发现性能很差,就发送邮件给全部门,而且抄送老大,这不老大早上就找我们开发了,让我们在完成日常的情况下,对这几个页面进行优化。
首先在本地Debug环境下,搭建了网站,修改了Action 内容,加入StopWatch 计时功能,并且开启log4net sql 日志打印功能。在StopWatch日志中记录整个Action执行只需要200ms,但是为什么整个页面使用Firdebug查看有1.34s。再次查看sql 日志,发现sql 请求很多。
先介绍下我们系统的情况:我们现在的系统是用mvc 2.0 和castle,nhibernate,在加上一些开源的组件。
对于日志中的sql继续查看,发现在查询列表的操作列中,对于Model的引用类型的延迟加载,在使用的时候,会每次请求数据库,这时,一页二十条数据,每条数据有两三个延迟加载属性,总的来说,就有三四十条sql 访问了,我大概统计了下,这些sql总耗时在1s 左右了。呵呵,发现了问题,就好解决了。既然是延迟加载的问题,那么去掉延迟加载就ok了。这时有两种方法;1)是修改XML配置,lazy=‘false’,2)是采用纯sql,而不是hsql。很明显第一种方案是有问题的。我们只想在查询的时候,不使用延迟加载,而不是整个系统都不是用。那么我们就只能修改sql了。在修改完sql的情况下,发现性能是提高了不少。接下来我们对于Action的返回结果也进行了压缩。对于查询条件中的下拉框通过ajax访问的数据,根据实地情况也加入了outputcache.

这时候,我使用了pagespeed工具来查看下我们的页面,这个工具给出了几个提示。根据提示,我们首先加了css,js,图片的 浏览器缓存,缓存时间设置为2天,因为我们每周二和四都要发布一次的。然后启用css,js,的压缩,当然了图片是不需要的,如果压缩了,反而性能不好。这些属性可以通过webConfig 配置和IIS的功能实现。
关于图片的格式jpg,png,gif :由于GIF只有256中颜色,而且采用无损压缩的格式,所以它更适合于做网站中的线条、图标和图纸,等一些简单的图片格式。jpg图片使用更有效的有损压缩算法,从而使做网站文件长度更小,下载时间更短。有损压缩会放弃图像中的某些细节,以减少文件长度。它的压缩比相当高,使用专门的JPG压缩工具其压缩比可达180:1,而且图像质量从浏览角度来讲质量受损不会太大,这样就大大方便了网络传输和磁盘交换文件。JPG较GIF更适合于照片,因为在照片中损失一些细节不像对艺术线条那么明显。另外,JPG对照片的压缩比例更大,而最后的质量也更好。
PNG是一种位图文件(bitmap file)存储格式,用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。

这样大概测试了下,整个页面加载也就300-400 ms ,可以接受了。

通过这次简单的web性能优化,发现了几个问题:
1. nhibernate 的延迟加载在查询页面的时候,性能很差,可惜我们系统没有使用CQRS架构,如果使用了查询页面可以通过nosql 来查询,上次有个小功能发现mongodb的查询和写入很给力的,600 多万条的数据,一会就写完了,而且查询也很快,而且还没做数据索引。现在考虑到CQRS系统,其实我们在做查询的时候,做了个简单的视图,这个也可以作为CQRS的简单版本。
2.csc,js,图片等资源,要有个静态文件服务器用于加载,这样性能高点。
3.书写代码的时候,应该css的样式文件在头部引入,而js文件在尾部引入。
4.对于一些常用,但是实时性要求不高web请求,都做缓存。
5.打包js和css文件减少网络传输。
6.对于一些返回值较大的Action都进行压缩,节省网络流量,和传输时间。





posted on 2012-01-04 14:37  刚子85  阅读(259)  评论(0编辑  收藏  举报