发布于 

Asp.Net的性能问题

性能对于一个应用程序来说是一个很重要的问题,在web的开发中也是一样,相信没有人愿意在电脑屏幕前花8秒钟来等待一个也面的打开,这就是常说的在web上的8秒钟原则。对于一个应用程序的性能我们应该把它当作是应用程序的一项功能,在设计的时候就应该处理好性能的问题,而不应该在整个程序开发完了以后再来进行优化,因为这样会付出更多的代价。

下面来讨论一下在asp.net中的性能问题。

asp.net相对于以前的版本asp通过引擎的改变,从而提高了性能。Asp是一种脚本解释引擎,有很多的代码是运行时接受用户请求后编译的,这样在很多的用户都发生同一请求时会造成服务器端的压力很重,而asp.net是采用一次编译的策略,只有当某一个页面第一次被请求时服务器才通过整个的编译过程,这样就大大提高了运行效率。但只是靠引擎的优化并不能完全解决asp.net的性能问题,代码的优化是另一个很重要的方面。

用Asp.net创建web应用程序时应该使用三层结构模型,三层就够是近几年来比较流行的一种模型。三层结构的三层分别为表示层(用户可以看到的页面)、业务层(实现应用程序的业务功能,一般称为组件,由.vb或.cs等文件编译而成的.dll控件)、数据层(主要涉及到用ado.net访问数据库)。三层结构可以使程序具有更好的可扩展性、灵活性、安全性、平台无关性以及可维护性。

Asp.net可以使用C#或vb.net这些面向对象的高级语言来编写逻辑代码,我们使用这些语言定义变量时要求显式地定义所有变量的类型,避免使用object类型的晚绑定方法,应该早绑定,早绑定有利于代码的执行有利于提高性能。我们可以在page指令中加上Explicit=”true”,如:<%@ Page Language=”VB” Explicit=”true”%>这样我们每次在声明变量时都应该指定类型。还可以在Page指令中加上Strict属性如:<%@ Page Language=”VB” Strict=”true” %>来避免晚绑定。

ViewState是asp.net的新功能。使用ViewState可以很容易地在往返服务器的过程中保持控件状态。但使用ViewState会使文件的大小明显增大而且还会影响性能。所以建议如果不是万不得已就应该关闭ViewState如:<%@ Page EnableViewState=”false” %> 或者是单独停掉某一个控件的ViewState。除此之外,对于Session我们还应该选择合适的方式存放,有三种方式:Inproc(在进程中存放)、StateServer(放在状态服务器)、database(在数据库中存放)。在Inproc中性能最好,但扩展性相对来说较差,其它的两种方式性能没Inproc好,但具有良好的扩展性,所以我们应该根据具体的情况来作选择。如果不需要使用Sesion也应该禁用如:<%@ Page EnableSession=”false” %> 这样有助于也面的请求。如果只是读取Session不做修改可以这样做:<%@ Page EnableSession=”ReadOnly” %> 也可以提高性能。

还有一个很重要的提高性能的方法就是使用缓存技术,asp.net中有三种缓存机制页面缓存、片段缓存和数据缓存。页面缓存是将频繁访问的页面放入缓存,当用户再次请求该页面时就不需要重新生成页面而是直接将缓存中的页面发送到客户端,节省了响应时间,极大提高了性能。具体做法是在页面代码中加上OutputCache指令,如:<%@ OutputCache Duration=”60” VaryByParam=”none” %> 在上面的代码中Duration是指缓存的时间,根据程序的实际情况自行设定,VaryByparam是指缓存的内容根据一个参数来发生变化。比方说已个页面上有一个查询天气的功能,当一个用户输入北京查询了后,页面被缓存了,另一个用户马上查询上海的天气,为了产生输出的结果还是被缓存的北京这样的错误,VaryByparam就起到作用了,<%@ OutputCache Duration=”60” VaryByParam=”TextBox1” %> 其中TextBox1是指输入地址的文本框的ID号。片段页面缓存主要是用于缓存用户控件中的内容,在用户控件的页面代码中添加OutputCache指令,然后在页面中加入用户控件就可以了。有些时候,用户会请求大量相同的数据,如果频繁地读取这些数据就会浪费很多的时间,这时就可以应用数据缓存技术来提高性能。可以通过编程的方式来缓存任何对象。在asp.net中是通过Cache类来实现的。如:

1
2
Cache[“myName”]=myName;  
myName=Cache[“myName”];

做web开发离不开数据库,在操作数据库的时候应尽量使用存储过程,这样可以消除数据库的往返访问。在使用DataSet和DataReader时也要注意,如果从数据库中查询出的数据只是在前端显示而不需要修改就应该使用DataReader,因为DataReader的性能比DataSet好。