网站优化.docx

上传人:b****1 文档编号:2838942 上传时间:2023-05-04 格式:DOCX 页数:18 大小:30.52KB
下载 相关 举报
网站优化.docx_第1页
第1页 / 共18页
网站优化.docx_第2页
第2页 / 共18页
网站优化.docx_第3页
第3页 / 共18页
网站优化.docx_第4页
第4页 / 共18页
网站优化.docx_第5页
第5页 / 共18页
网站优化.docx_第6页
第6页 / 共18页
网站优化.docx_第7页
第7页 / 共18页
网站优化.docx_第8页
第8页 / 共18页
网站优化.docx_第9页
第9页 / 共18页
网站优化.docx_第10页
第10页 / 共18页
网站优化.docx_第11页
第11页 / 共18页
网站优化.docx_第12页
第12页 / 共18页
网站优化.docx_第13页
第13页 / 共18页
网站优化.docx_第14页
第14页 / 共18页
网站优化.docx_第15页
第15页 / 共18页
网站优化.docx_第16页
第16页 / 共18页
网站优化.docx_第17页
第17页 / 共18页
网站优化.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

网站优化.docx

《网站优化.docx》由会员分享,可在线阅读,更多相关《网站优化.docx(18页珍藏版)》请在冰点文库上搜索。

网站优化.docx

网站优化

net网站优化

一、数据库操作

1、用完马上关闭数据库连接

访问数据库资源需要创建连接、打开连接和关闭连接几个操作。

这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。

ASP.NET中提供了连接池(ConnectionPool)改善打开和关闭数据库对性能的影响。

系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。

连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。

因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。

用(推荐)using(SqlConnectionConn=newSqlConnection(connstr)){}//不必显示关闭

或try{conn.Open();}catch{}finally{conn.Close();}

2、尽量使用存储过程,并优化查询语句

存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。

存储过程具有对数据库立即访问的功能,信息处理极为迅速。

使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。

在.NETFramework提供的所有数据访问方法中,基于SQLServer的数据访问是生成高性能、可缩放Web应用程序的推荐选择。

使用托管SQLServer提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。

另外,存储过程在服务器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。

优化查询语句

ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。

因此,尽量使用优化过的SQL语句以减少执行时间。

比如,不在查询语句中包含子查询语句,尽量只返回有用的数据、字段,充分利用索引等。

3、只读数据访问用SqlDataReader,不要使用DataSetSqlDataReader类提供了一种读取从SQLServer数据库检索的只进数据流的方法。

如果当创建ASP.NET应用程序时出现允许您使用它的情况,则SqlDataReader类提供比DataSet类更高的性能。

情况之所以这样,是因为SqlDataReader使用SQLServer的本机网络数据传输格式从数据库连接直接读取数据。

另外,SqlDataReader类实现IEnumerable接口,该接口也允许您将数据绑定到服务器控件。

DataSet作为一个功能强大的、支持离线的数据库,其对性能的开销也相对较大。

Sqldataread优点:

读取数据非常快。

如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。

缺点:

直到数据读完才可close掉于数据库的连接。

Dataset是把数据读出,缓存在内存中。

缺点:

对内存的占用较高。

如果对返回的数据需做大量的处理用Dataset比较好些可以减少对数据库的连接操作。

优点:

只需连接一次就可close于数据库的连接。

一般情况下,读取大量数据,对返回数据不做大量处理用SqlDataReader.对返回数据大量处理用datset比较合适.对SqlDataReader和Dataset的选择取决于程序功能的实现。

4、数据的绑定DataBinder

一般的绑定方法%#DataBinder.Eval(Container.DataItem,"字段名")%

用DataBinder.eval绑定不必关心数据来源(read或dataset)。

不必关心数据的类型eval会把这个数据对象转换为一个字符串。

在底层绑定做了很多工作,使用了反射性能。

正因为使用方便了,但却影响了数据性能。

来看下%#DataBinder.Eval(Container.DataItem,"字段名")%。

当于dataset绑定时,DataItem其实式一个DataRowView(如果绑定的是一个数据读取器(dataread)它就是一个IdataRecord。

)因此直接转换成DataRowView的话,将会给性能带来很大提升。

%#ctype(Container.DataItem,DataRowView).Row("字段名")%

对数据的绑定建议使用%#ctype(Container.DataItem,DataRowView).Row("字段名")%。

使用时注意两个方面:

1.需在页面添加%@Importnamespace="System.Data"%.2.注意字段名的大小写(要特别注意)。

如果和查询的不一致,在某些情况下会导致比%#DataBinder.Eval(Container.DataItem,"字段名")%还要慢。

如果想进一步提高速度,可采用%#ctype(Container.DataItem,DataRowView).Row(0)%的方法。

不过其可读性不高。

以上的是的写法。

在c#中:

%#((DataRowView)Container.DataItem)["字段名"]%

5、返回多个结果集

无论SqlDataReader还是datset,返回多个结果集,然后用rd.NextResult()或ds.Tables[i]来分别处理数据,减少重复连接数据库的次数。

同时尽量用比较高效的SQL代替后续复杂的DataSet二次加工。

二、页面优化

1、不使用不必要的服务器控件(ServerControl)

ASP.net中,大量的服务器端控件方便了程序开发,但也可能带来性能的损失,因为用户每操作一次服务器端控件,就产生一次与服务器端的往返过程。

因此,非必要,应当少使用ServerControl。

还有许多其他情况,在这些情况中呈现或数据绑定比使用服务器控件更有效,甚至是在使用服务器控件模板时。

但是,如果要以编程方式操作服务器控件的属性、处理服务器控件事件或利用视图状态保存,则使用服务器控件是适当的。

所以,尽量选择html控件。

能在客户端实现的功能就在客户端实现(熟练掌握javascript),减少服务器的压力。

2、不使用不必要的ViewState

默认情况下,ASP.Net对所有的ServerControl都启用了ViewState(视图状态)。

但ViewState需要在客户端保存一些信息,这会造成性能的消耗。

当必须使用ServerControl时,可以考虑禁止ViewState。

只在必要时保存服务器控件视图状态。

自动视图状态管理是服务器控件的功能,该功能使服务器控件可以在往返过程上重新填充它们的属性值(您不需要编写任何代码)。

但是,因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器,所以该功能确实会对性能产生影响。

您应该知道在哪些情况下视图状态会有所帮助,在哪些情况下它影响页的性能。

例如,如果您将服务器控件绑定到每个往返过程上的数据,则将用从数据绑定操作获得的新值替换保存的视图状态。

在这种情况下,禁用视图状态可以节省处理时间。

默认情况下,为所有服务器控件启用视图状态。

若要禁用视图状态,请将控件的EnableViewState属性设置为false,如下面的DataGrid服务器控件示例所示。

asp:

datagridEnableViewState="false"runat="server"/您还可以使用@Page指令禁用整个页的视图状态。

当您不从页回发到服务器时,这将十分有用:

%@PageEnableViewState="false"%

注意@Control指令中也支持EnableViewState属性,该指令允许您控制是否为用户控件启用视图状态。

若要分析页上服务器控件使用的视图状态的数量,请(通过将trace="true"属性包括在@Page指令中)启用该页的跟踪并查看ControlHierarchy表的Viewstate列。

3、避免到服务器的不必要的往返过程

虽然您很可能希望尽量多地使用Web窗体页框架的那些节省时间和代码的功能,但在某些情况下却不宜使用ASP.NET服务器控件和回发事件处理。

通常,只有在检索或存储数据时,您才需要启动到服务器的往返过程。

多数数据操作可在这些往返过程间的客户端上进行。

例如,从HTML窗体验证用户输入经常可在数据提交到服务器之前在客户端进行。

通常,如果不需要将信息传递到服务器以将其存储在数据库中,那么您不应该编写导致往返过程的代码。

如果您开发自定义服务器控件,请考虑让它们为支持ECMAScript的浏览器呈现客户端代码。

通过以这种方式使用服务器控件,您可以显著地减少信息被不必要的发送到Web服务器的次数。

使用Page.IsPostBack避免对往返过程执行不必要的处理

如果您编写处理服务器控件回发处理的代码,有时可能需要在首次请求页时执行其他代码,而不是当用户发送包含在该页中的HTML窗体时执行的代码。

根据该页是否是响应服务器控件事件生成的,使用Page.IsPostBack属性有条件地执行代码。

例如,下面的代码演示如何创建数据库连接和命令,该命令在首次请求该页时将数据绑定到DataGrid服务器控件。

voidPage_Load(Objectsender,EventArgse){if(!

Page.IsPostBack){}}

由于每次请求时都执行Page_Load事件,上述代码检查IsPostBack属性是否设置为false。

如果是,则执行代码。

如果该属性设置为true,则不执行代码。

注意如果不运行这种检查,回发页的行为将不更改。

Page_Load事件的代码在执行服务器控件事件之前执行,但只有服务器控件事件的结果才可能在输出页上呈现。

如果不运行该检查,仍将为Page_Load事件和该页上的任何服务器控件事件执行处理。

4、当不使用会话状态时禁用它,并且程序开发中尽量少用Session

并不是所有的应用程序或页都需要针对于具体用户的会话状态,您应该对任何不需要会话状态的应用程序或页禁用会话状态。

若要禁用页的会话状态,请将@Page指令中的EnableSessionState属性设置为false。

例如:

%@PageEnableSessionState="false"%

注意如果页需要访问会话变量,但不打算创建或修改它们,则将@Page指令中的EnableSessionState属性设置为ReadOnly。

若要禁用应用程序的会话状态,请在应用程序Web.config文件的sessionstate配置节中将mode属性设置为off。

例如:

sessionstatemode="off"/

5、合理使用DataGrid(在2.0中为GridView)控件

DataGrid控件带有最强大的数据显示功能,还内置了对数据的修改、删除、添加、分页等很多功能。

如果只需简单的显示数据,DataGrid并非最佳选择。

DataGrid控件的分页功能,数据的存储方式(存储在viewstate中)等,虽然让程序开发者使用方便快捷,但由此产生的性能开销不容小视。

DataList控件比DataGrid功能少了很多。

但自定义性强了很多。

特有的多行数据显示还是比较方便的。

DataGrid能实现的功能,它基本能实现。

Repeater控件功能最少,但自定义性非常强。

由于减少了很多功能,对服务器的性能带来消耗最小。

因此,在只需简单显示数据列表时,选择Repeater或DataList控件同样可以达到目的,而且减轻了性能上的开销。

建议选择顺序:

Repeater然后DataList最后DataGrid(GridView)

6、对数据进行分页

ASP.NET的DataGrid(在2.0中为GridView)有一个非常有用的功能:

分页。

如果DataGrid允许分页,在某一时刻它只下载某一页的数据,另外,它有一个数据分页的浏览导航栏,它让你可以选择浏览某一页,而且每次只下载一页的数据。

但是它有一个小小的缺点,就是你必须把所有的数据都绑定到DataGrid中。

也就是说,你的数据层必须返回所有的数据,然后DataGrid再根据当前页过滤出当前页所需要的数据显示出来。

如果有一个一万条记录的结果集要用DataGrid进行分页,假设DataGrid每页只显示25条数据,那就意味着每次请求都有9975条数据都是要丢弃的。

每次请求都要返回这么大的数据集,对应用程序的性能影响是非常大的。

一个好的解决方案是写一个分页的存储过程,如:

CREATEPROCEDUREdbo.sp_DataPages@SqlnVARCHAR(2000),@PKvarchar(50),--主键字段名(可以是任何数据类型;不能,并且也不需要带表名前缀,如:

不可以是users.id)@Ordervarchar(50),--排序方式(带desc或asc,可以是多个组合;不能,并且也不需要带表名前缀,如:

不可以是users.iddesc)@Pageint,@PageSizeint=30ASsetnocountonDECLARE@StrnVARCHAR(4000)

if(@Page=1)SET@Str='SelectTop'+CAST((@PageSize)AsVARCHAR(20))+'*From('+@Sql+')Astable1OrderBytable1.'+@OrderelseSET@Str='SelectTop'+CAST((@PageSize)AsVARCHAR(20))+'*From('+@Sql+')Astable1Wheretable1.'+@PK+'NotIn(SelectTop'+CAST((@PageSize*(@Page-1))ASVARCHAR(20))+''+@PK+'From('+@Sql+')Astable2OrderBytable2.'+@Order+')OrderBytable1.'+@Order

--print@str--exec(@Str)EXECsp_ExecuteSql@StrsetnocountoffGO

或者,使用sqlserver2005中的row_number()函数

declare@sqlvarchar(8000)

set@sql='select*'+'from'+'('

+'selectrow_number()over(orderbyiddesc)asrowNumber,*'+'fromUsers'+'whereid0andname'''''

+')'+'astable1'

+'whererowNumberbetween'+str((@page-1)*@pagesize+1)+'AND'+str(@page*@pagesize)+'orderbyiddesc'

--exec(@sql)EXECsp_ExecuteSql@sql

(小技巧:

将记录总数保为Cache或Session来提高分页性能。

7、不要禁用Web窗体页的缓冲

除非有特殊的原因要关闭缓冲,否则使其保持打开。

禁用Web窗体页的缓冲会导致大量的性能开销。

启用页面输出的缓冲区(Buffer)如果Buffer的机制被关闭,可以用下面的方法打开。

使用程序打开页面输出缓存:

Response.BufferOutput=true;

使用@Page开关打开页面输出缓冲机制:

%@PageBuffer="true"%

使用Web.config或Machine.config配置文件的pages节点:

pagesbuffer="true"/

8、设置page的smartnavigation属性

smartnavigation设置为true能让用户明显的感觉性能提高。

启用此属性后对客户端和服务端影响不大.它能智能刷新需要刷新的部分。

在大多数情况下不要在代码中设置该属性。

在.aspx文件的@Page指令中将SmartNavigation属性设置为true。

请求该页时,动态生成的类将设置该属性。

InternetExplorer5或更高版本浏览器请求页时(或稍后),智能导航将通过执行下列功能提高用户对该页的操作能力:

消除导航导致的闪烁。

从一页移动到另一页时保持滚动位置。

保持导航之间的元素焦点。

在浏览器的历史记录中只保留最后一页的状态。

智能导航最适用于需要频繁回发,但是其内容在返回时不会发生显著更改的ASP.NET页。

在决定是否将该属性设置为true时,请仔细考虑这一点。

三、c#(或)程序改进

1、使用值类型的ToString方法

在连接字符串时,经常使用"+"号直接将数字添加到字符串中。

这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。

但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对象中。

使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。

intnum=1;stringstr="go"+num.ToString();

2、运用StringBuilder类

String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。

在处理字符串时,最好使用StringBuilder类,其.NET命名空间是System.Text。

该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。

其定义及操作语句如下所示:

intnum;

System.Text.StringBuilderstr=newSystem.Text.StringBuilder();//创建字符串

str.Append(num.ToString());//添加数值numResponse.Write(str.ToString);//显示操作结果

3、使用HttpServerUtility.Transfer方法在同一应用程序的页面间重定向

采用Server.Transfer语法,在页面中使用该方法可避免不必要的客户端重定向(Response.Redirect)。

4、避免使用ArrayList。

因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。

建议使用自定义的集合类型代替ArrayList。

2.0提供了一个新的类型,叫泛型,这是一个强类型,使用泛型集合就可以避免了封箱和拆箱的发生,提高了性能。

5、使用HashTale代替其他字典集合类型(如StringDictionary,NameValueCollection,HybridCollection),存放少量数据的时候可以使用HashTable.

6、为字符串容器声明常量,不要直接把字符封装在双引号""里面。

//避免MyObjectobj=newMyObject();obj.Status="ACTIVE";

//推荐conststringC_STATUS="ACTIVE";MyObjectobj=newMyObject();obj.Status=C_STATUS;

7、不要用ToUpper(),ToLower()转换字符串进行比较,用String.Compare代替,它可以忽略大小写进行比较.例:

conststringC_VALUE="COMPARE";if(String.Compare(sVariable,C_VALUE,true)==0){Console.Write("相同");}也可以用str==String.Empty或者str.Length==0判断是否为空。

(注意判断输入数据的长度,可防止sql注入式攻击)将String对象的Length属性与0比较是最快的方法,避免不必要的调用ToUpper或ToLower方法。

8、类型转化Int32.TryParse()优于Int32.Parse()优于Convert.ToInt32()。

建议.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。

因为:

Convert.ToInt32会把最终的解析工作代理给Int32.Parse;Int32.Parse会把最终的解析工作代理给Number.ParseInt32;Int32.TryParse会把最终的解析工作代理给Number.TryParseInt32。

9、如果只是从XML对象读取数据,用只读的XPathDocument代替XMLDocument,可以提高性能

//避免XmlDocumentxmld=newXmlDocument();xmld.LoadXml(sXML);txtName.Text=xmld.SelectSingleNode("/packet/child").InnerText;

//推荐XPathDocumentxmldContext=newXPathDocument(newStringReader(oContext.Value));XPathNavigatorxnav=xmldContext.CreateNavigator();XPathNodeIteratorxpNodeIter=xnav.Select("packet/child");iCount=xpNodeIter.Count;xpNodeIter=xnav.SelectDescendants(XPathNodeType.Element,false);while(xpNodeIter.MoveNext()){sCurrValues+=xpNodeIter.Current.Value+",";}

10、避免在循环体里声明变量,应该在循环体外声明变量,在循环体里初始化。

C#程序开发要遵循的一个基本原则就是避免不必要的对象创建

//避免for(inti=0;i10;i++){SomeClassobjSC=newSomeClass();}

//推荐SomeClassobjSC=null;for(inti=0;i10;i++){objSC=newSomeClass();}

11、捕获指定的异常,不要使用通用的System.Exception.

//避免try{somelogic}catch(Exceptionexc){Errorhandling}

//推荐try{somelogic}catch(System.NullReferenceExceptionexc){Errorhandling}catch(System.ArgumentOutOfRangeExceptionexc){Errorhandling}catch(System.InvalidCastExceptionexc){Errorhandling}

12、使用Try.catch.finally时,要在finally里释放占用的资源如连接,文件流等不然在Catch到错误后占用的资源不能释放。

try{}catch{}finally{conntion.close();}

13、不要用Exception控制程序流程有些程序员可能会使用异常来实现一些流程控制。

例如:

try{result=100/num;}Catch(Exceptione){result=0;}

但实际

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2