关于网站的性能优化(转)

http://www.codingthink.com/c/20121215/201212151219043.html

关于网站的性能优化 (一家之言,感谢指正)

前端:

1. 减少http请求:每一次请求都需要服务器进行处理响应,这都需要耗用服务器资源和时间,我们在设计网站是应该尽量减少http请求。

   1> 有时候为了清晰我们会将css和javascript脚本分开书写,但如此就会增加我们请求的次数,所以在保持条理清晰的前提下,我们应该尽量将javascript脚本和css分别整合到同一个文件中,这样我们就避免了上述的问题。

   2> 同样的,对于频繁出现的图标等内容,我们也应该加以整合,以CSS的position和width以及height设置后进行展示,这样也可以减少请求的次数,而有时候这样做也可以减小图片的大小,因为图片合并后,它们之前的一些附加信息,比如安全信息、版本信息等内容都进行了清理。

2. 压缩组件:IIS启动GZIP压缩功能,可以减小传输流量。

3. 将样式表放在页面顶部:页面加载样式表时会对页面元素进行重绘,这必然会影响页面的加载,所以我们应该尽量将样式表放在页面的顶部。

4. 尽量将javascript放在页面的底部:javascript的加载会阻塞其后面内容的加载,所以,如果条件允许,我们应该尽量将javascript脚本后置。

5. 使用外部的CSS和javascript:因为浏览器会对我们使用过的内容进行缓存,所以一些重复使用的CSS和javascript会直接从缓存中进行读取,所以对于能够重用的CSS和javascript我们应当放入外部的CSS和javascript中。

6. 精简javascript和CSS:从JQuery的min版本我们就可以看到,它对一些空格和字段进行了删减,在保持其功能的前提下,消减了文件的大小,给加载带来了一定的便利,同样的,如果我们要实现高性能的网页时,也应该注意这些,尽量减小javascript和CSS的内容。

7. 避免重定向:在重定向的过程中,会加长用户等待的时间

8. 使Ajax可缓存:这主要体现在用户体验上,如果用户在访问一个网站时转而去访问另一个网站,当他访问完后回到前一个网站再次发出与前一次完全相同的的请求,这时如果我们能够直接读取数据,无疑会使用户的体验大大加强。

后台:   

业务方面:

1. 提高程序本身性能:诸如进行字符串处理时使用StringBuilder代替string,集合使用List<T>代替ArrayList,提高算法性能等。

2. 减小返回内容的大小:用Json格式的对象代替字符串拼接等。

3. 当需要批量操作数据库时,尽量减少创建连接次数。

   1> 在SqlDataReader读取批量数据的时候,我们可以一次性的将数据读出,放入List<T>或者Dictionary<K,V>中,然后进行数据的操作,而不是每次创建一个连接。具体代码为设置System.Data.CommandBehavior.CloseConnection,在DataReader操作结束后再断开连接。

   2> 在EntityFramework增删改操作的时候,尽量集中附加对象,在最后进行SaveChange操作。

4. 慎用ViewState:我们常用的状态保持技术有ViewState、缓存、Cookie、Session、Application等,这其中ViewState是记录页面信息的隐藏字段,如果不禁用,在每一次创建控件树和判断IsPostback后服务器都需要对其进行解析,而服务器在页面生命周期结束之前也会对其进行更新,将页面信息保存到ViewState中,返回给用户,这其中不但加重了页面代码的大量冗余,也增加了服务器处理解析的压力,其中尤以与数据库交互产生的ViewState为多。

5. 尽量减少对文件的操作并限制用户上传文件的大小。

6. 图片水印等操作尽量在用户上传的时候完成(一些大型的网站为了保持数据的原态会忽略这一操作,在用户访问的时候临时加水印)

7. 在必要的情况下使用缩略图代替原图(有时也可以在缩略图生成后删除原图,如用户头像,原图我们一般不会使用,在生成缩略图之后,我们可以将原图删除);

8. 对于大量的文件我们可以采用树状结构存储,这样可以减少遍历文件的数量。

9. 将图片与Web服务器分离

10. 很多时候网站的图片数量极为巨大,这时,我们就需要针对图片做一些优化,常用的方法是,将图片的路径以树状方式存储在不同的服务器和数据库中,并以树状结构存储在一台或几台单独的服务器上。

11. 进程外Session的使用,对于大型网站,往往服务端并不是在同一台服务器上,这时我们就需要使用进程外Session,使几个服务器共享Session值。

12. 使用缓存(Cache):避免频繁访问数据库或者硬盘上的资源。  

  对于一些不是经常改变但又频繁使用的数据,我们需要添加到缓存,这样,我们就可以减少访问数据库的次数,降低数据库的压力。

   1> 比如重置用户密码时给用户发送邮件所需要的邮箱地址和密码等数据,我们就可以放到缓存中,而数据库的数据发生改变时,我们只需要在修改数据库数据的代码中将该缓存清除,等下一个用户在发出请求,修改后的数据自然会再次放到缓存中,进行重用。

   2> 再比如大型网站的页,访问量非常大,我们不能在用户每次访问时都去读取全部的内容,这样会非常消耗服务器的资源,所以我们应该根据各个模块,分别设置缓存,定时刷新,这样就大大降低了服务器的压力。

   对于一些经常需要访问的文件,我们也可以将其添加到缓存,毕竟磁盘的读写是硬件驱动的,所有信息都需要通过磁头写入到高速旋转的扇区中,而缓存却是电驱动,信息存储十分快捷,所以我们可以利用这一特性,减少文件的访问。  

  1> 日志的存储,在用户和其他人员进行一些操作时,我们需要进行记录,将一些操作或者异常信息写入到日志中,一旦这种操作十分频繁时,很容易出现问题,所以我们可以设置定期的缓存,先将日志写入到缓存中,等缓存到期,再将缓存中的数据写入日志文件,然后清除缓存,重新创建(为了减少频繁操作,我们一般只会记录异常信息)。

13. 分布式缓存的使用:缓存是一种空间换取时间的操作方式,所以为了分担服务器的压力,我们需要将缓存放在不同的服务器上,目前我们常用的分布式缓存程序有:Memcached和MongoDb等。

14. 事务的分流:服务级别的分布式事务操作往往占据事务锁时间比较长,一旦大量并发,很容易导致死锁,所以我们要根据服务的的重要性进行分级,除非有必要,一般的服务我们直接以异步队列的方式执行,错误直接记录日志,这样,就大大减少了事务的数量,实现了事物的分流。

15. SOA服务粒度的把控:SOA服务粒度即是一个服务功能所包含功能的大小。有时候我们完成一个操作往往需要实现很多功能,当使用细服务粒度的时候往往需要多次交互,而使用粗服务粒度我们就可以有效的解决多次交互的问题,但同时粗服务粒度却又不够灵活,这就需要我们能够做到很好的把控,在需要的情况下尽量粗粒度化。

服务器:

1. 优化sql语句  

  使用参数化查询,避免注入式漏洞攻击。  

  调整where顺序,尽量减少遍历次数。  查询语句避免使用*。  

  尽量使用where替代having,having会遍历出所有数据再进行过滤,在性能上相对较低,所以可以使用where时尽量使用where。  

  使用表的别名,使用别名后可以减少解析的时间。  

  避免在索引上使用计算,一旦在索引上进行计算,索引的值发生了改变之后,其索引的功能就会被破坏。

2. 针对经常查询而又不经常修改的字段创建聚簇索引进行索引扫描。

posted @ 2013-01-16 15:13  .NET Fans  阅读(161)  评论(0编辑  收藏  举报