一、性能参数:
1、 吞吐量
2、 响应时间
3、 执行时间
4、 可伸缩性
二、性能优化方案:
编号
|
方案
|
说明
|
状态
|
1
|
在部署应用程序时,应该关闭Debug模式,这将有效提高应用程序性能(web.config文件的debug=false)
|
|
|
2
|
在部署应用程序时,使用RELEASE模式进行编译发布,优化程序资源!
|
|
|
3
|
尽量避免使用throw Exception,减少额外的开销
提供用户一个友好的出错页面
|
protected
void Application_Error(Object sender, EventArgs e)
{
……
.
Application["error"] = error;
Response.Redirect("MyErrorPage.aspx");
}
由于捕获的异常,所以性能提升不大,但提供了统一的友好的出错信息页面
|
|
4
|
对适当的动态页面进行页面级缓存<%@ OutputCache Duration="60" VaryByParam="*" %>,提高访问速度!
两种情况:
1. 按照参数不同,进行不同版本的缓存
2. 按照URL不同,进行不同版本的缓存
例如:
|
Aspx页面中:
<%@ OutputCache Duration="300" VaryByParam="id" VaryByCustom="ceshi" %>
Global.asax中:
public
override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "ceshi")
{
string s_cs=Request.Url.ToString();
return Request.Url.ToString() ;
}
return base.GetVaryByCustomString( context, arg);
}
|
|
5
|
尽量使用存储过程完成数据操作
|
|
|
6
|
对于只读的数据访问
, 使用
DateReader代替DataSet
|
|
|
7
|
关闭不必要的
ViewState
|
使用 ViewState 时,每个对象都必须先序列化到 ViewState 中,然后再通过回传进行反序列化,因此使用 ViewState 并非是没有代价的。<input type="hidden"
没有进行加密,ViewState 只是进行了 Base64 编码
每个控件(在标记上) <asp:datagrid EnableViewState="false" ?/>
每个页面(在指令中) <%@ Page EnableViewState="False" ?%>
每个应用程序(在 web.config 中) <Pages EnableViewState="false" ?/>
|
|
8
|
调整数据库
SQL语句
|
前提:需要在完全理解业务逻辑的情况下
|
|
9
|
调整索引
|
|
|
小测试,说明索引的重要性,虽然执行时间只是从3毫秒降到了0毫秒,但只是对于测试环境单用户而言,当成千上万的用户并发操作,造成服务器资源竞争激烈(内存IO/磁盘IO/CPU的上下文切换),CPU的执行时间应该会以几何级的速度增长!
select count(*) from dbo.公交
--12120笔记录
/*------目前没有索引的状况
Table Scan 全表扫描
逻辑读 256 次
执行时间 3 毫秒-------*/
set showplan_all on
go
select * from dbo.公交 where city='宣城'
go
set showplan_all off
go
|--select * from dbo.公交 where city='宣城'
|--Compute Scalar(DEFINE:([公交].[LineStop]=[公交].[LineStop]))
|--Table Scan(OBJECT:([CQ20].[dbo].[公交]), WHERE:([公交].[city]=Convert([@1])))
set statistics io on
go
select * from dbo.公交 where city='宣城'
go
set statistics io off
go
表 '公交'。扫描计数 1,逻辑读 256 次,物理读 0 次,预读 0 次。
set statistics time on
go
select * from dbo.公交 where city='宣城'
go
set statistics time off
go
SQL Server 执行时间:
CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。
/*-----------------创建city字段的索引-------------------*/
CREATE
INDEX [idx_city] ON [dbo].[公交] ([city])
/*------建立索引后的状况
Index Seek 索引扫描
逻辑读 9 次
执行时间 0 毫秒 -------*/
set showplan_all on
go
select * from dbo.公交 WITH(INDEX=idx_city) where city='宣城'
go
set showplan_all off
go
|--select * from dbo.公交 WITH(INDEX=idx_city) where city='宣城'
|--Compute Scalar(DEFINE:([公交].[LineStop]=[公交].[LineStop]))
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([CQ20].[dbo].[公交]))
|--Index Seek(OBJECT:([CQ20].[dbo].[公交].[idx_city]), SEEK:([公交].[city]='宣城') ORDERED FORWARD)
set statistics io on
go
select * from dbo.公交 WITH(INDEX=idx_city) where city='宣城'
go
set statistics io off
go
表 '公交'。扫描计数 1,逻辑读 9 次,物理读 0 次,预读 0 次。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。