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

关注性能的人群大致分为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. 【sqli-labs】 less7 GET - Dump into outfile - String (导出文件GET字符型注入)

    使用此漏洞需要知道WEB程序的根路径并且MYSQL的secure-file-priv配置应为可写入该路径 添加单引号,发现错误被屏蔽 对应的SQL语句应为 ')) ... 字段还是3个 在数据库中执行 ...

  2. Model2

    Model1: Model2:

  3. Content-Encoding与Content-Type的区别

    RFC 2616 for HTTP 1.1 specifies how web servers must indicate encoding transformations using the Con ...

  4. python学习笔记之小小购物车

    #coding=utf-8 ''' Created on 2015-6-18 @author: 悦文 ''' def goods_list(): shangpin={"} print &qu ...

  5. Python画三维图-----插值平滑数据

    一.二维的插值方法: 原始数据(x,y) 先对横坐标x进行扩充数据量,采用linspace.[如下面例子,由7个值扩充到300个] 采用scipy.interpolate中的spline来对纵坐标数据 ...

  6. eas之事件

    选择事件 选择事件是在选择块发生变化后发出.table.addKDTSelectListener(new KDTSelectListener(){    public void tableSelect ...

  7. Codeforces Round #548 (Div. 2) A. Even Substrings

    You are given a string 

  8. 值得收藏--GitHub Top 20 开源项目

    参考链接:https://github.com/Aufree/trip-to-iOS/blob/master/Top-100.md 项目名称                            项目 ...

  9. jQuery源码分析 开篇(一)

    解读一个开源框架,最终目的当然就是学习程序的设计思想和实现技巧. JavaScript宗旨就是Write Less, Do More,简洁的API,优雅的链式,强大的查询与便捷的操作都是我们喜欢他的原 ...

  10. JavaSE 学习笔记之面向对象(三)

    面向对象 特点: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想.   过程和对象在我们的程序中是如何体现的呢?过程 ...