首先想到的是优化算法、改进技术、扩展设备去做优化。其实在讨论性能的时候,绕不开对业务的理解,不同的业务系统对性能的要求不同,优化方式也不一样。优化性能的前提是保证业务的正确性。我们平时关注的性能主要是系统的执行速度。

关注性能的人群大致分为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数据库,然后查找当前数据库

BS程序性能调优的更多相关文章

  1. java程序性能调优---------------性能概述

    一.程序的性能通过哪几个方面表现 1.执行速度(程序反应反应是否迅速.响应时间是否足够短) 2.分配内存 (分配内存是否合理,是否过多的消耗内存或者内存溢出) 3.启动时间(程序从运行到可以正常处理业 ...

  2. 程序性能调优工具之gprob

    1 简介改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数消耗掉了大部分执行时间,这通常都不是非常明显的.GNU 编译器工具包所提供了一种剖析工具 GNU profiler(gpro ...

  3. [development][profile][dpdk] KK程序性能调优

    KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项de ...

  4. 【Java/Android性能优化1】Android性能调优

    本文参考:http://www.trinea.cn/android/android-performance-demo/ 本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.La ...

  5. Android性能调优

    本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.Layout优化.数据库优化.算法优化.延迟执行等.一.性能瓶颈点整个页面主要由6个Page的ViewPager,每个Pag ...

  6. 成为Java GC专家(5)—Java性能调优原则

    并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

  7. Android性能调优实例

    本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.Layout优化.数据库优化.算法优化.延迟执行等. 目前性能优化专题已完成以下部分: 性能优化总纲——性能问题及性能调优方 ...

  8. golang 性能调优分析工具 pprof (上)

    一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...

  9. Java程序性能优化读书笔记(一):Java性能调优概述

    程序性能的主要表现点: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏 启动时间:程序从运行到可以正常处理业务需要花费多少时间 负载承 ...

随机推荐

  1. window 8 电脑操作服务集合(网址)

    如何开启Win8远程桌面 http://jingyan.baidu.com/album/48206aeae06627216ad6b3bf.html?picindex=2 Win8.1用户账户的配置管理 ...

  2. Nuxt报错

    新增了个文件store.js: //本地存储的工具库 if(!window.localStorage){ alert('你的浏览器不支持localStorage'); } var store ={ s ...

  3. phpstorm 使用

    常用快捷 ctrl + / 单行注释 Alt+1 隐藏左侧任务栏 设置 1:control+shift+A功能可以搜索对应功能,把mouse:Change font size(Zoom) ...的按钮 ...

  4. 爬虫系列(七) requests的基本使用

    一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...

  5. php实现网站访客数量统计的方法(简单实现,不能防刷新)

    方法一: <?php function Counter()//定义函数 { $five = "00000";//声明变量,$five,$four等变量表示零的个数,放在数字前 ...

  6. C#学习笔记_01_基础内容

    01_基础内容 进(位)制 十进制:逢10进1,数字由0-9组成: 二进制:逢2进1,数字由0-1组成: 八进制:逢8进1,数字由0-7组成: 十六进制:逢16进1,数字由0-9和a-f组成: 进制转 ...

  7. python项目开发:ftp server开发

    程序要求: 1.用户加密认证 (对用户名密码进行MD5验证)2.允许同时多用户登陆 (使用socket server方法,为每个用户都创建一个信息文件)3.每个用户有自己的家目录,且只能访问自己的家目 ...

  8. JUnit单元测试实践:测试工具类和方法(EmptyUtils)

    以前的时候(读大学时),我认为写单元测试太费事了.现在,我改变看法了. 工作中,为了提高Web开发的质量和效率,近期又为了保证自己的工具类等一系列可复用组件的质量,我煞费苦心地开始认真学习和撰写单元测 ...

  9. 阿里云 LAMP 使用基础

    产品亮点 1.基于阿里云CentOS7.2镜像 2.采用yum方式安装,软件安装均为默认目录,未作任何修改. 3.采用经典LAMP组合,拓展性强,资源丰富,解决方案较多 4.附带PhpMyadmin和 ...

  10. Atcoder AGC031B Reversi (DP计数)

    简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...