Asp.Net程序性能 浅谈
目录 |
1. .页面和服务器控件处理 |
2. .状态管理 |
3. .数据访问 |
4. .Web 应用程序 |
5. .优化技巧和要点 |
一、页面和服务器控件处理
避免与服务器间的过多往返行程
使用Page.IsPostback 避免往返行程上的额外工作
谨慎适当地使用服务器控件
避免过多的服务器控件视图状态
Ex:
<asp: datagrid EnableViewState="false" datasource="" runat="server"/>
<%@ Page EnableViewState=”false” %>
二、状态管理
在未使用时禁用会话状态
ü 并不是所有的应用程序或页都需要具体用户的会话状态;您应该在不需要时禁用会话状态
Ex: <%@Page EnableSessionState=”false” %>
ü 如果页需要访问会话变量,但不打算创建或修改它们,则将@ Page 指令中的EnableSessionState 属性设置为ReadOnly
ü 可以禁用XML Web services 方法的会话状态
Ex: [WebMethod (false)]
[WebMethod (EnableSession=false)]
ü 若要禁用应用程序的会话状态,请在应用程序的Web.config 文件的SessionState 节中将Mode 属性设置为Off
Ex :< SessionState mode=”off”/>
三、状态管理
慎重选择会话状态提供程序
ü 进程内会话状态
Ø 迄今为止速度最快的解决方案
Ø 如果仅在会话状态中存储少量易失数据,则应使用进程内提供程序
Ex :< sessionState mode=”inProc”/>
ü 作为Windows 服务的进程外会话状态
Ex:
<sessionState mode=”StateServer” stateConnectionString=”tcpip=localhost:
ü SQL 数据库中的进程外会话状态
Ø 用于跨多个处理器或多个计算机缩放应用程序
Ø 用于Web 花园和Web 农场方案,或用于当服务器/进程重新启动时不能丢失数据的情况
Ex :< sessionState mode=”SQLServer” allowCustomSqlDatebase=”false”
sqlConnectionString=”data source=ben\sql2005; uid=sa”/>
aspnet_regsql.exe –S ben\sql2005 –U sa –ssadd –sstype p
四、数据访问
将SQL 存储过程用于数据访问
ü 在.NET 框架提供的所有数据访问方法中,基于SQL 的数据访问是生成性能最好的可缩放Web 应用程序的最佳选择
ü 使用托管SQL 提供程序时,可通过使用编译的存储过程而不是特殊查询,获得额外的性能提高
使用SqlDataReader 获得快进只读数据游标
ü SqlDataReader 对象对从SQL 数据库中检索的数据提供前进只读游标
ü 在ASP.NET 应用程序中使用只读流,则SqlDataReader 类提供比Dataset 类更高的性能
ü SqlDataReader 类使用SQL Server 的本机网络数据传输格式从数据库连接直接读取数据
ü SqlDataReader 类实现IEnumerable 接口,该接口也使您可以将数据绑定到服务器控件
尽可能缓存数据和页输出
ü 在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据
ü 通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域),可以优化这些页的性能
ü 注意:
Ø 不要缓存太多项
Ø 给缓存项分配的有效期不要太短
五、Web 应用程序
大型Web 应用程序,请预编译它
ü 减少首次访问页时的分析及编译开销
必要时调整应用程序每个辅助进程的线程数
ü 该结构将根据可用于请求的CPU 功率,来决定允许同时执行的请求数。这项技术称作线程门控
ü 使用与“ASP.NET Applications” 性能对象关联的“Pipeline Instance Count”(管线实例计数)性能计数器,可以在Windows 性能监视器中监视线程门控
ü 通过更改Machine.config 配置文件processModel 元素(ASP.NET 设置架构)节中的MaxWorkerThreads 和MaxIOThreads 属性,手动设置进程中的线程数限制
ü 辅助线程是用来处理ASP.NET 请求的,而IO 线程则是用于为来自文件、数据库或XML Web services 的数据提供服务的
对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺
禁用调试模式
Ex: <compilation debug=”true”>
优化Web 服务器和特定应用程序的配置文件
ü 仅对需要的应用程序启用身份验证
Ø 默认情况下,ASP.NET 应用程序的身份验证模式为Windows 或集成的NTLM
Ø 大多数情况下,最好仅对需要身份验证的应用程序在Machine.config 文件中
禁用身份验证,并在Web.config 文件中启用身份验证
Ex :< authentication mode=”Forms”>
<forms name=”SDP” loginUrl=”login.aspx” protection=”All” path=”/”>
</authentication>
ü 根据适当的请求和响应编码设置来配置应用程
Ø ASP.NET 默认编码格式为UTF-8
Ø 如果您的应用程序仅使用ASCII 字符,请配置您的ASCII 应用程序以获得稍许的性能提高
Ex: <globalization requestEncoding=”utf
优化Web 服务器和特定应用程序的配置文件
ü 考虑对应用程序禁用AutoEventWireup
Ø 重写Page 对象的OnLoad 方法,而不是使用Page_Load 方法
Ex: <pages autoEventWireupautoEventWireup="false"/>
ü 从请求处理管线中移除不用的模块
六、优化技巧和要点
不要依赖代码中的异常
ü 异常非常浪费资源,应在代码中尽量避免。绝不要将异常作为控制常规程序流的方法
ü 检查空值,分配给将分析为数字值的字符串,在应用数学运算前检查特定值
// this is not recommended. Try { Result = 100 / num; } Catch (Exception e) { Result = 0;; } |
// this is preferred. If (num! = 0) { Result = 100 / num ; } Else { Result = 0 ; } |
对字符串连接使用Response. Write
ü 在页面或用户控件中对字符串连接使用HttpResponse.Write 方法
Response. Write("a") Response. Write(myString) Response. Write("b") Response. Write(myObj.ToString()) Response. Write("c") Response. Write(myString2) Response. Write("d")
|
ü 大量字符串连接时不要使用+ ,应使用StringBuilder来构造
string str Write strWrite; strWrite= "ABC"; strWrite+= strTest; strWrite+= ……; |
StringBuilder sb= new StringBuilder(); sb.Append("ABC"); sb.Append(strTest)
|
1. 适当地使用公共语言运行库的垃圾回收器和自动内存管理
2. 不要对每个请求使用过多内存(如在内存中存储大型对象或数据集),因为这样垃 圾回收器将必须更频繁地进行更多的工作
3. 当不再需要对象时,请不要在代码中保留不必要的对象引用,因为在它们仍然被引用的情况下,垃圾回收器将无法释放资源
4. 尽量避免使用含Finalize 方法的对象,因为它们在后面会导致更多垃圾回收器工作
5. 将大量调用的COM 组件移植为托管代码
6. 大的性能障碍之一是将数据从非托管环境封送到托管环境
7. 在交互操作中,请在任何一端执行尽可能多的任务,然后进行单个调用而不是一系列小调用
8. 例如,公共语言运行库中的所有字符串都是Unicode 的,所以应在调用托管代码之前将组件中的所有字符串转换成Unicode 格式
这些只是抛砖引玉,更多有关于性能方面的知识可以查阅《Improving ASP.NET Performance》