高性能ASP.NET应用程序的探讨与研究

来源:互联网 发布:iphone mac同步照片 编辑:程序博客网 时间:2024/05/18 03:39

高性能ASP.NET应用程序的探讨与研究

 

 

 

  要:本文首先简单介绍了ASP.NET的概况和特性,然后列举出几个影响ASP.NET应用程序性能的度量标准,最后结合本人开发Web应用程序的经验总结出若干条改进ASP.NET应用程序性能的方法和技巧。

 

关键字:ASP.NET;调试

 

 

 

0   

 

ASP.NET是微软公司推出的新一代的动态服务器页面,目前的版本是1.0。它是微软的.NET框架结构中的一个重要组成部分。在性能上,ASP.NET比以往的ASP 30更加强大和稳定:ASP.NET提供了更易于编写、结构更清晰的代码,这些代码很容易进行再利用和共享;ASP.NET使用编译后的语言,从而提升性能和伸缩性;ASP.NET使用Web表单使开发更直观,利用面向对象技术促进组件的再利用。另外,ASP.NET中还包括有页面事件、Web控件、缓冲技术以及服务器控件和对数据捆绑的改进。总之,ASPNET强大的功能使之成为开发Web应用程序的利器之一。   

 

 

 

1  ASP.NET的特性

 

    ASP.NET页面有许多独到的特性:

 

第一,ASP.NET页面是结构化的。即每个页面都是一个有效继承了.NET WebPage类的一个类,可以重写在WebPage类的生存期中调用的一些方法。因为可以用明确的含义把一个页面的功能分解成事件处理程序,所以ASP.NET页面更易于理解。

 

第二,控件可以将可重复使用的功能封装起来,用户不必额外编写代码,即可实现状态管理、确认、数据处理等功能,从而简化了许多普通的编程任务。

 

    第三,ASP.NET页面可以在VS.NET中创建它们,在这个环境中还可以创建ASP.NET页面使用的事务逻辑和数据访问组件,而且可以在编辑器中调试ASP.NET页面。

 

    第四,ASP.NET页面的最大优点是它没有ASP对非结构脚本语言(包括VBscriptJscript)的依赖性。ASP.NET允许用户可以使用任何一种ASP.NET支持的语言编写代码,除了支持VBC#等语言外,凡是可以编译成MSIL的程序语言,都可以成为制作ASP.NET页面的程序语言,而且可以实现跨语言操作。

 

    可以看出,ASP.NETWeb应用程序提供了一个真正的中间语言的执行框架。

 

 

 

2  影响ASP.NET应用程序性能的度量标准

 

    下面介绍四个常见的性能度量标准:

 

    . 执行时间

 

    处理一个请求所需的时间,通常按服务器向客户端返回的第一个字节和最后一个字节之间的时间计算。执行时间直接影响吞吐量的计算。

 

    . 响应时间

 

    从发出请求到服务器向客户端返回第一个字节之间的时间长度。对于客户端用户,这通常是性能中最直观的一个方面。如果应用程序响应时间很长,用户可能会觉得不耐烦,并转到另一个站点。应用程序的响应时间的改变与吞吐量的速率无关(甚至成反比)。

 

    . 可缩放性

 

    用于衡量应用程序在获取更多资源(内存、处理器或计算机)时更好地执行的能力。它经常按吞吐量相对于处理器数的更改速率计算。

 

    .

 

    Web 应用程序在单位时间之内可以处理的请求数,经常以每秒请求数衡量。吞吐量可以根据应用于服务器的加载(客户端线程数)而不同。这通常被视为要优化的最重要的性能度量。

 

为了编写正常且高效执行的应用程序,务必要保持这些度量的合理取值范围。

 

 

 

3         改进ASP.NET应用程序的性能

 

    从以上可以看出,ASP.NET模型提供了许多内置的性能增强功能,尤其是在HTTP 请求的处理方面的两项功能:第一,当首次请求 ASP.NET 页面时,将动态编译 Page 类的实例。公共语言运行时 (CLR)会将 ASP.NET 托管页代码实时 (JIT) 编译为处理服务器的本机代码。第二,当为第一个请求编译 Page 类实例后,就将其缓存到服务器上。对于随后对该页的每个请求,将执行该类缓存的实例。除非该页的初始源或它的一个依赖项发生更改,否则对 Page 类的编译只发生在最初请求之后,这极大的提高了ASP.NET页面的访问速度。

 

    虽然如此,但要保证用户所编写的应用程序能够同时处理多个 HTTP 请求,从而改善ASP.NET应用程序的性能,还需从以下几个方面着手来确保所编写的代码能够达到可接受的性能级别:

 

0要禁用调试模式。在部署生产应用程序或进行任何性能测量之前,始终记住禁用调试模式。如果启用了调试模式,应用程序的性能可能受到非常大的影响。通常在 web.config 文件中为应用程序设置调试模式:方法是将 compilation debug设为false, 当然在应用程序设计阶段,可以将其设为true,便于调试。

 

1当不使用会话状态时要禁用它。并不是所有的应用程序或页都需要针对于具体用户的会话状态,此时就应该对任何不需要会话状态的应用程序或页禁用会话状态。方法是将@ Page 指令中的 EnableSessionState 属性设置为 false。例如,<%@ Page EnableSessionState="false" %> 注意如果页需要访问会话变量,但以后不会创建或修改它们,则将 @ Page 指令中的 EnableSessionState 属性设置为 ReadOnly。若要禁用应用程序的会话状态,需在应用程序 web.config 文件的 sessionstate 配置节中将 mode 属性设置为 off。例如,<sessionstate mode="off" />

 

2进行字符串处理时尽量使用StringBuilder类。字符串在.NET框架中是不可变的,这意味着改变字符串的操作符和方法会返回字符串的改变后的拷贝,这意味着性能还有提高的空间。当进行大量的字符串操作时,使用StringBuilder类就是一种比较好的选择,经测试,使用StringBuilder类的Append方法的速度比使用字符串连接的速度快了许多。。

 

3尽量减少表单回送。可使用 Page.IsPostback 避免对往返行程执行不必要的处理。如果编写处理服务器控件回发处理的代码,可能要在首次请求页时执行Web 窗体代码,而不是当用户发送包含在该页中的 HTML 窗体时执行的代码。根据该页是否是响应服务器控件事件生成的,使用IsPostBack 属性有条件的执行代码。例如,下面的代码演示如何创建数据库连接和命令,该命令在首次请求该页时将数据绑定到 DataGrid 服务器控件。

 

   void Page_Load(Object sender, EventArgs e)

 

   {

 

        // ...Set up a connection and command here....

 

        if (!Page.IsPostBack) {

 

            String query = "select * from Authors where FirstName like '%JUSTIN%'";

 

            myCommand.Fill(ds, "Authors");

 

            myDataGrid.DataBind();

 

        }

 

    }

 

由于每次请求时都执行 Page_Load 事件,该代码检查 IsPostBack 属性是否设置为 false。如果设置为 false,则执行代码;否则,不执行代码,这样就可以加快传送速度,从而改善了ASP.NET应用程序的性能。

 

4在适当的环境中使用服务器控件。检查应用程序代码以确保对 ASP.NET 服务器控件的使用是必要的。虽然它们非常易于使用,但是服务器控件并不总是完成任务的最佳选择,因为它们会使用服务器资源。在许多情况下,一个简单的呈现或数据绑定替换就可以完成任务。但是,如果要以编程方式操作服务器控件的属性、处理服务器控件事件或利用视图状态保存,则使用服务器控件是适当的。

 

5只在必要时保存服务器控件视图状态。自动视图状态管理是服务器控件的功能,该功能使服务器控件可以在往返行程上重新填充它们的属性值,而不需要编写任何代码。但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器,所以该功能确实会对性能产生影响。例如,如果将服务器控件绑定到每个往返行程上的数据,则将用从数据绑定操作获得的新值替换保存的视图状态。在这种情况下,禁用视图状态可以节省处理时间。默认情况下,为所有服务器控件启用视图状态。若要禁用视图状态,请将控件的 EnableViewState 属性设置为 false,如下面的 DataGrid 服务器控件示例所示。

 

<asp:datagrid EnableViewState="false" datasource="..." runat="server"/>

 

还可以使用@ Page 指令禁用整个页的视图状态。当不从页回发到服务器时,这将十分有用:

 

<%@ Page EnableViewState="false" %>

 

6尽量不要依赖代码中的异常。因为异常会大大降低应用程序的性能,所以一般不要将它们用作控制程序流程的方式。如果检测到代码中可能会产生异常,可以参照如下方法:检查 null值或在应用数学运算前检查特定值。下面的程序片段演示可能导致异常的代码以及改进后的处理方式。两者产生的结果完全相同。

 

// Consider changing this...

 

try {

 

   result = 100 / num;

 

}

 

catch (Exception e) {

 

  result = 0;

 

}

 

 

 

// to this...

 

if (num != 0)

 

   result = 100 / num;

 

else

 

  result = 0;

 

7VB.NET Jscript 代码中尽量使用早期绑定。以往,开发人员喜欢使用VBVBscript Jscript 的原因之一就是它们“无类型”的性质。只需使用它们即可创建变量,它们不需要显式的类型声明。当从一个类型到另一个类型进行分配时,转换将自动执行。不过,这种便利可能大大降低应用程序的性能。VB语言现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容的目的,默认情况下,ASP.NET 不启用该选项。但是,为了得到最佳性能,强烈建议在页中启用该选项。若要启用 Option Strict,请将 Strict 属性包括在@ Page 指令中;或者,对于用户控件,请将该属性包括在@ Control 指令中。下面的程序代码演示了如何设置该属性。

 

<%@ Page Language="VB" Strict="true" %>

 

<%

 

Dim B

 

Dim C As String

 

 

 

' This will cause a compiler error.

 

A = "Hello"

 

' This will cause a compiler error.

 

B = "World"

 

' This will not cause a compiler error.

 

C = "!!!!!!"

 

' But this will...

 

C = 0

 

%>

 

8将调用密集型的 COM 组件迁移到托管代码。.NET 框架提供了一个非常简单的方式与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是,在某些情况下,保留旧组件的性能成本超出了将组件迁移到托管代码的费用。通常 COM 互用性的性能影响与进行的函数调用的次数或从非托管代码到托管代码封送的数据量成比例。所以将需要大量调用以进行交互的任何 COM 组件迁移到托管代码进行研究。或者,可以考虑重新设计组件(以要求较少的调用),或者在单个调用中封送更多的数据。

 

9 SQL Server 存储过程用于数据访问。在 .NET 框架提供的所有数据访问方法中,基于 SQL Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 SQL Server 提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。

 

 

 

4         结束语

 

ASP.NET的产生与发展为Web应用程序的开发提供了一个崭新的空间和舞台,虽然其性能较以往有了很大的提高,但要开发出高性能的Web应用程序,还需要进行诸多细节的设置和修改,本文就此提出了若干条改进的方法和技术。但由于ASP.NET仍处于发展阶段,因此其改进技术还有待于进一步研究。

 

 

 

 

 

参考文献:

 

[1] Douglas J.Reilly. ASP.NET Web应用程序开发新思维[M].   北京:清华大学出版社,2002

 

[2] Simon Robinson, Ollie Cornes. C#高级编程[M].   . 北京:清华大学出版社,2002

原创粉丝点击