首先想到的是优化算法、改进技术、扩展设备去做优化。其实在讨论性能的时候,绕不开对业务的理解,不同的业务系统对性能的要求不同,优化方式也不一样。优化性能的前提是保证业务的正确性。我们平时关注的性能主要是系统的执行速度。
关注性能的人群大致分为3类人群,分别是使用者、开发者好运维人员。使用者主要关注的是感知性能(感觉上的执行速度),开发者主要关注的是系统的实际执行速度,运维人员主要关注的是资源的使用情况和系统的执行速度。
BS系统涉及到三部分,分别是前端、后端和数据库。而前端涉及到浏览器对响应结果的下载和渲染,后端主要指C#编写的业务代码,数据库主要指对业务数据的存储和查询。
在实际优化中发现,优化前端和数据库的效果比优化后端的效果要好。
优化性能有多种方式,本次主要分享开发人员可以控制的优化技巧。
前端实现优化(目的:加快显示速度,提升客户感知性能):
1、 减少http请求次数
80%的响应时间花在下载网页内容,减少请求次数是缩短响应时间的关键(原因:浏览器对相同域名的并行下载有限制,一般是2-3个并行请求,js文件除外)。
可以通过简化页面设计来减少请求次数,页面内容较多可以采用以下技巧。
A、 捆绑文件:
将CSS和JS文件进行捆绑,在asp.net中可以使用ScriptManager,asp.net MVC中的Bundling。在这个过程中,一般是把公用的js或css文件合并成一个文件,具体界面特有的js或css合并成一个文件
B、CSS Sprites(图片精灵): 就是把多个图片拼成一副图片,然后通过CSS来控制在什么地方具体显示这整张图片的什么位置。
使用场景:在站点中使用多个图标或小图片
2、 在响应头信息中添加Expires 或Cache-Control报文头,让浏览器缓存css、js、图片等静态文件,好处:节约带宽、加快显示、减少请求次数、减轻服务器压力。弊端:文件改变的时候,需要在引用位置处改变版本号或修改文件名称。例如:<img src=”a.gif?version=1.1.1”/>
为了充分利用浏览器的缓存,尽量在样式和脚本,写到独立的css和js文件中。
3、 把CSS样式文件置顶
样式表(CSS)放在网页的HEAD中,会让浏览器尤先下载CSS文件,逐步渲染已加载的网页内容,改善客户的感知性能。
如果将样式表放在底部,浏览器会拒绝逐步渲染已下载的网页。原因:大多数浏览器在实现时都避免重绘,样式表中的内容是绘制网页的关键信息,没有下载下来前,浏览器是不会渲染网页。
4、 把JS文件置底,放到body标签的末尾
浏览器在下载JS文件的时候,采用的串行下载模式。当开始下载JS文件的时候,浏览器会阻止其它内容的下载,这样就会降低客户的感知性能。
5、 页面布局采用CSS+DIV,而非Table
浏览器对CSS+DIV采用的流式渲染模式,是逐步渲染逐步显示。而Table需要浏览器全部渲染完毕后,才显示。
6、 对图片采用延迟加载,可以节约带宽
7、 在服务器端启用GZIP压缩,节约带宽,加快下载
Gzip格式是一种很普遍的压缩技术,几乎所有的浏览器都有解压Gzip格式的能力,而且它可以压缩的比例非常大,一般压缩率为85%。
8、 压缩css、js、图片,减少文件体积
CSS和JS文件被压缩后,文件体积会减少50%
9、删除不必要的Cookie或相应头部信息,从而减小Cookie大小和避免泄露更多的服务器信息
后端代码优化(目的:加快系统的执行速度和节约系统资源)
1、使用ASP.NET WebForm开发时,默认关闭ViewState,需要时再开启。关闭ViewState可以从根本上减少页面的大小,并显着提高页面加载时间。
2、使用ASP.NET WebForm开发时,避免使用表格控件,如Grid控件
3、在做ASP.NET 开发时,如果没有必要使用Page页面,尽量不使用,而使用handler或module。例如:验证码的生成,使用handler
4、在使用多字符串拼接的时候,尽量使用strinBuilder
5、基本类型转换成字符串时,尽量调用toString(),避免引起装箱
6、在遍历集合时,尽量使用foreach,避免在遍历的时候改变集合大小。如果有该需求,请使用for
7、在开发中如果使用委托或事件的定义,尽量使用C#提供的Action、Func、EventHandler或lamda表达式。
8、在使用数据库连接的时候,尽量晚创建早释放,否则会降低数据库性能。即便是程序报错,也要保证能正确释放数据库连接。数据库连接不会自动释放,需要手动释放该连接。
9、在数据库连接字符串中开启数据库连接池,提高数据库连接性能。ADO.NET默认是启用连接池的。默认连接池的最小是0,最大是100,默认请求等待超时时间为15秒。代码:
Pooling: true;Min Pool Size=25;Max Pool Size=75;Connection Timeout:15。一般情况下10-20个数据库连接,就够用了。
10、把数据库连接字符串,配置到web.config中。好处:方便修改和避免连接字符串的不同,打开新的数据库连接。
11、减少数据库的连接次数。如果需要查询多个数据集,最好一次返回多个数据集。
12、在查询数据库时避免使用游标,而是使用数据集的查询。原因:数据库擅长数据集查询,消耗资源小,而游标消耗资源比较大。
13、在使用数据库查询时,使用存储过程代替动态SQL字符串,好处:防止SQL攻击和减少网络传输数据,同时还可以利用SQL Server数据库的编译计划。如果确实需要动态生成SQL字符串,请使用参数化查询字符串。
14、对某些页面开启页面缓存,如产品目录页
15、实时性要求不高但查询耗费性能的页面,可以采用预处理,比如报表页面、历史统计页面
16、在做分页时尽量在数据库端做分页,而不是在C#代码中做分页,这种分页通常称为”假分页”
数据库优化(目的:加快系统的执行速度和节约系统资源)
1、在设计表结构烦人时候适当冗余,可以提高性能。比如注册用户表中的省市
2、数字型的字段,在性能上高于字符串,如查询更快、占用空间小,因此在设计的时候尽量使用数字型的字段.例如IP
3、Text类型性能远低于varchar/nvarchar,在设计时,尽量使用varchar/nvarchar
4、数据表中的字段不能太多,一般控制在20-50个,字段长度够用就行,要把大字段单独拆分出去。例如把产品属性和产品详情拆分到两个表。
5、避免使用Null字段,索引查询难于优化
6、自增列Id做主键,可以加快查询
7、不要把图片存到数据库中
8、尽量不在数据库做运算,复杂的运算移到程序端CPU中运算
9、在需要改善查询的地方增加索引,避免增加不必要的索引,在建立索引的时候,可以优先考虑复合索引。
10、在建立索引的时候,要注意索引字段的区分度,对于区分度比较低的字段,即使建立索引也不能提高查询性能。如性别
10、不在索引列进行数学运算或函数运算,这样会无法使用索引,导致全表扫描
11、把大SQL,拆分成多条简单SQL,简单SQL缓存命中率高,减少锁表示时间
12、尽量不使用select *,只取需要的数据列。使用select *,会消耗更多CPU、内存、IO、网络带宽。只取需要的数据列,可以减少表变化带来的影响,也可以节约带宽和内存。
13、避免负向查询,如not != <>
14、避免%前缀模糊查询,无法使用索引,导致全表扫描。
15、避免使用count(*),开销比较大,而是使用coount(col)
16、合并结果集时,默认使用union all,而union有去重开销
17、不建议使用两个表以上的join
18、字段进行比较时,原则上要保证数据类型一致,避免类型转换,破坏索引
19、避免使用游标,尽量使用基于数据集的操作
20、避免长事务
21、存储过程名称不要使用前缀sp_.当sp_前缀的存储过程被提交执行时,SQL Server会首先查找master数据库,然后查找当前数据库
转载于:https://www.cnblogs.com/ljf10223063/p/7168557.html