网站的性能对于ASPNET程序开发人员来说非常重要一个优秀的网站虽然有美观的页面设计完善的服务功能但是打开网页时有长时间的延迟用户最终将会无法忍受尤其对于大型的电子商务网站而言每秒钟有数万用户同时访问没有良好的网站性能根本无法满足庞大的需求
ASPNET作为全新一代的动态网页生成系统它在平台性能方面与原有的ASP相比已有了一个本质的提高但要在此基础上开发出专业水准的符合生产标准的受用户欢迎的web应用程序还需要开发人员从编程的角度在页面数据访问和字符串处理等各方面进行优化处理以提高网站的总体性能
本文将主要探讨在ASPNET中与此相关的几种进行性能优化的方法及注意问题
页面性能优化
会话状态的恰当选择
HTTP协议是一种无状态的通信协议无法记录和识别来自不同客户端的请求但在实际应用中系统却要维护来自客户端的不同请求之间的会话状态信息ASPNET通过将会话状态信息存储在进程状态服务器或SQL Server数据库中来解决这个问题
将会话状态信息保存在WEB服务器的内存中具有最佳的性能速度很快但是却缺乏会话状态信息跨越多个服务器的能力若要在多个WEB服务器之间维护会话信息可以使用状态服务器进行存储这种方式由于可以将应用程序部署到多台服务器上而提高了系统的伸缩性和可靠性但是以降低性能为代价对于极其重要的会话信息需要使用SQL Server存储方式从而避免丢失重要的会话信息但由此产生的工作负载比前两者大得多
若不考虑状态信息的保留和多个服务器共享应尽量选择保存在服务器的进程中从而得到最佳的性能
会话状态信息的存储方式选择通过nfig文件
<sessionState
mode=InProc/StateServer/SqlServer //存储方式由此行选择
stateConnectionString=tcpip=:
……
timeout=/>
服务器控件的优化选择
减少不必要的服务器控件
服务器控件带来的方便和功能是html控件所不能比拟的但是每一个服务器控件都需要在服务器端创建相应的对象是以牺牲服务器端的资源为代价的过多的使用服务器控件会极大的影响程序性能
很多情况下简单地使用html标记或数据绑定即能够实现所需功能比如<asp:Label>控件若使用它来显示静态信息则完全可用简单的标记来实现如果html控件达不到所要实现的功能而且在脚本语言如javascriptvbscript也不能实现的情况下才考虑选择服务器控件
禁用不必要的状态视图
服务器控件的状态视图属性能够自动的在页面往返过程中维护服务器控件的状态减少开发者的工作量但是需要占用大量的服务器内存资源因此在不需要服务器控件状态视图的情况下应将其EnableViewState属性设置为false如常用的<asp:Lable>和<asp:Button>控件
PageIsPostBack的运用
PageIsPostBack用于记录页面是否从客户端返回若为false表示初次运行否则表示从客户端再次返回该页面PageIsPostBack的合理应用可以避免页面在往返过程中的一些不必要的操作在Page_Load函数及一些只需要初始化一次的事件函数中均可以使用该属性来提高应用程序性能
void Page_Load(Object o EventArgs e)
{
if(! PageIsPostBack)
{
conn=new SqlConnection(server=localhost;uid=sa;pwd=;database=data);
String sql=select * from student;
cmdFill(dsstu);
mydataGridDataBind();
}
}
以上代码将保证只有在首次访问该页面时对数据库进行读取并绑定
合理使用DataGrid控件
DataGrid控件带有最强大的数据显示功能还内置了对数据的修改删除添加分页等很多功能如果只需简单的显示数据 DataGrid并非最佳选择DataGrid控件的分页功能数据的存储方式(存储在viewstate中)等虽然让程序开发者使用方便快捷但由此产生的性能开销不容小视
DataList控件比DataGrid功能少了很多但自定义性强了很多特有的多行数据显示还是比较方便的DataGrid能实现的功能它基本能实现
Repeater控件功能最少但自定义性非常强由于减少了很多功能对服务器的性能带来消耗最小
因此在只需简单显示数据列表时选择Repeater或DataList控件同样可以达到目的而且减轻了性能上的开销
数据库访问性能优化
数据库的连接和关闭
访问数据库资源需要创建连接打开连接和关闭连接几个操作这些过程需要多次与数据库交换信息以通过身份验证比较耗费服务器资源ASPNET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响系统将用户的数据库连接放在连接池中需要时取出关闭时收回连接等待下一次的连接请求
连接池的大小是有限的如果在连接池达到最大限度后仍要求创建连接必然大大影响性能因此在建立数据库连接后只有在真正需要操作时才打开连接使用完毕后马上关闭从而尽量减少数据库连接打开的时间避免出现超出连接限制的情况
使用存储过程
存储过程是存储在服务器上的一组预编译的SQL语句类似于DOS系统中的批处理文件存储过程具有对数据库立即访问的功能信息处理极为迅速使用存储过程可以避免对命令的多次编译在执行一次后其执行规划就驻留在高速缓存中以后需要时只需直接调用缓存中的二进制代码即可
另外存储过程在服务器端运行独立于ASPNET程序便于修改最重要的是它可以减少数据库操作语句在网络中的传输
优化查询语句
ASPNET中ADO连接消耗的资源相当大SQL语句运行的时间越长占用系统资源的时间也越长因此尽量使用优化过的SQL语句以减少执行时间比如不在查询语句中包含子查询语句充分利用索引等
字符串操作性能优化
使用值类型的ToString方法
在连接字符串时经常使用+号直接将数字添加到字符串中这种方法虽然简单也可以得到正确结果但是由于涉及到不同的数据类型数字需要通过装箱操作转化为引用类型才可以添加到字符串中但是装箱操作对性能影响较大因为在进行这类处理时将在托管堆中分配一个新的对象原有的值复制到新创建的对象中
使用值类型的ToString方法可以避免装箱操作从而提高应用程序性能
运用StringBuilder类
String类对象是不可改变的对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象其方法ToString对性能的提高并非很显着
在处理字符串时最好使用StringBuilder类其NET 命名空间是SystemText该类并非创建新的对象而是通过AppendRemoveInsert等方法直接对字符串进行操作通过ToString方法返回操作结果
其定义及操作语句如下所示
int num;
SystemTextStringBuilder str=new SystemTextStringBuilder(); //创建字符串
strAppend(numToString()); //添加数值num
ResponseWrite(strToString); //显示操作结果
ASPNET应用程序性能测试
在对ASPNET应用程序进行性能测试之前应确保应用程序没有错误而且功能正确具体的性能测试可以采用以下工具进行
Web Application Strees Tool (WAS)是Microsoft发布的一个免费测试工具可以从上下载它可以模拟成百上千个用户同时对web应用程序进行访问请求在服务器上形成流量负载从而达到测试的目的可以生成平均TTFB平均TTLB等性能汇总报告
Application Center Test (ACT) 是一个测试工具附带于Visual StudioNET的企业版中是Microsoft正式支持的web应用程序测试工具它能够直观地生成图表结果功能比WAS多但不具备多个客户机同时测试的能力
服务器操作系统管理工具中的性能计数器可以对服务器进行监测以了解应用程序性能
结论
对于网站开发人员来说在编写ASPNET应用程序时注意性能问题养成良好的习惯提高应用程序性能至少可以推迟必需的硬件升级降低网站的成本