ASP.NET页面负载性能优化

页面负载性能优化主要通过使用 ViewState 获得最佳性能,使用 ViewState 时,每个对象都必须先序列化到 ViewState 中,然后再通过回传进行反序列化,因此使用 ViewState 并非是没有代价的。但是,如果遵循某些简单的原则对 ViewState 的成本加以控制,则通常不会产生明显的性能影响。

在不需要时禁用 ViewState,或者使用优化过的 ViewState 序列化程序,这些程序运行速度很快,并已经过优化,可以生成很小的 ViewState。如果要序列化一个未在上面列出的类型,可以创建一个自定义 TypeConverter 来显著提高它的性能。

尽量减少使用对象,如果可能,尽量减少放入 ViewState 中的对象的数目。例如,不要使用二维字符串数组(名称/值,其对象的数目与数组的长度一样多),而应使用两个字符串数组(只有两个对象)。但是,在将两个已知类型存储在 ViewState 中之前,在这两者之间转换不会获得任何性能提高,因为这样做实际上相当于付出了两次转换的代价。

减少使用 ViewState,默认情况下 ViewState 将被启用,并且是由每个控件(而非页面开发人员)来决定存储在 ViewState 中的内容。有时,这一信息对应用程序并没有什么用处。尽管也没什么害处,但却会明显增加发送到浏览器的页面的大小。因此如果不需要使用 ViewState,最好还是将它关闭,特别是当 ViewState 很大的时候。

可以基于每个控件、每个页面或每个应用程序来关闭 ViewState。在以下情况中将不再需要 ViewState:

(1)页面控件

(2)页面不回传给自身。

(3)处理的不是控件的事件。

(4)控件没有动态的或数据绑定的属性值(或对于每一个请求它们都设置在代码中)。

DataGrid 控件是 ViewState 的一个重量级用户。默认情况下,在网格中显示的所有数据也都存储在 ViewState 中,当需要一个复杂的操作(如复杂的搜索)来获取数据时,这是非常有用的。但是,DataGrid 的这种行为有时也使得 ViewState 成为累赘。例如,这里有一个简单的页面就属于上述情况。因为页面不回传给自身,所以它并不需要 ViewState。

ViewState1.aspx

<%@ Page language="c#" Codebehind="ViewState1.aspx.cs" AutoEventWireup = "false" Inherits="Webtest.ViewState1" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

       <HEAD>

              <title>ViewState1</title>

              <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">

              <meta name="CODE_LANGUAGE" Content="C#">

              <meta name="vs_defaultClientScript" content="JavaScript">

              <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

       </HEAD>

       <body MS_POSITIONING="GridLayout">

              <form id="ViewState1" method="post" runat="server">

                     <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 18px; POSITION: absolute; TOP: 17px" runat="server" AllowPaging="True">

                            <PagerStyle Mode="NumericPages"></PagerStyle>

                     </asp:DataGrid>

              </form>

       </body>

</HTML>

 

ViewState1.aspx.cs

<%@ Page language="c#" Codebehind="ViewState1.aspx.cs" AutoEventWireup="false" Inherits="Webtest.ViewState1" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

       <HEAD>

              <title>ViewState1</title>

              <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">

              <meta name="CODE_LANGUAGE" Content="C#">

              <meta name="vs_defaultClientScript" content="JavaScript">

              <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

       </HEAD>

       <body MS_POSITIONING="GridLayout">

              <form id="ViewStusing System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

 

namespace Webtest

{

       /// <summary>

       /// ViewState1 的摘要说明。

       /// </summary>

       public class ViewState1 : System.Web.UI.Page

       {

              protected System.Web.UI.WebControls.DataGrid DataGrid1;

      

              private void Page_Load(object sender, System.EventArgs e)

              {

                     string mSql = "server=localhost;database=Northwind;uid=sa;pwd=110";

                     SqlConnection mSC = new SqlConnection(mSql);

                     mSC.Open();

                     DataTable mDT = new DataTable();

                     SqlCommand mScmd = new SqlCommand(" SELECT TOP 10 OrderID FROM Orders ",mSC);

                     SqlDataReader mSdr = mScmd.ExecuteReader();

                     this.DataGrid1.DataSource = mSdr;

                     this.DataGrid1.DataBind();

                     mSdr.Close();

                     mScmd.Connection.Close();

                     mScmd.Dispose();

              }

 

              #region Web Form Designer generated code

              override protected void OnInit(EventArgs e)

              {

                     //

                     // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。

                     //

                     InitializeComponent();

                     base.OnInit(e);

              }

             

              /// <summary>

              /// 设计器支持所需的方法 - 不要使用代码编辑器修改

              /// 此方法的内容。

              /// </summary>

              private void InitializeComponent()

              {   

                     this.Load += new System.EventHandler(this.Page_Load);

 

              }

              #endregion

       }

}

aGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 18px; POSITION: absolute; TOP: 17px" runat="server" AllowPaging="True">

                            <PagerStyle Mode="NumericPages"></PagerStyle>

                     </asp:DataGrid>

              </form>

       </body>

</HTML>

启用 ViewState 时,这个小网格会给该页面增加 1.03KB的 HTML 有效负载(启用前1.16KB,启用后2.19KB)!使用 ASP.NET Tracing(英文)或查看发送到浏览器的页面的源代码(如以下代码所示),可以清楚地看到这一点。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

  <HEAD>

              <title>ViewState1</title>

              <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">

              <meta name="CODE_LANGUAGE" Content="C#">

              <meta name="vs_defaultClientScript" content="JavaScript">

              <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

  </HEAD>

       <body MS_POSITIONING="GridLayout">

              <form name="ViewState1" method="post" action="ViewState1.aspx" id="ViewState1">

<input type="hidden" name="__VIEWSTATE" value="dDwtNDYxODExNjQ5O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDE+Oz47bDx0PEAwPHA8cDxsPERhdGFLZXlzO18hSXRlbUNvdW50O1BhZ2VDb3VudDtfIURhdGFTb3VyY2VJdGVtQ291bnQ7PjtsPGw8PjtpPDEwPjtpPDE+O2k8MD47Pj47Pjs7Ozs7Ozs7O0AwPEAwPHA8bDxIZWFkZXJUZXh0O0RhdGFGaWVsZDtTb3J0RXhwcmVzc2lvbjtSZWFkT25seTs+O2w8T3JkZXJJRDtPcmRlcklEO09yZGVySUQ7bzx0Pjs+Pjs7Ozs+Oz47PjtsPGk8MD47PjtsPHQ8O2w8aTwyPjtpPDM+O2k8ND47aTw1PjtpPDY+O2k8Nz47aTw4PjtpPDk+O2k8MTA+O2k8MTE+Oz47bDx0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNDk7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNTE7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNTg7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNjA7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNjU7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNjc7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNjk7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNzA7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNzQ7Pj47Pjs7Pjs+Pjt0PDtsPGk8MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8MTAyNzU7Pj47Pjs7Pjs+Pjs+Pjs+Pjs+Pjs+Pjs+MoVVAO3zAriyh2nQY6RJHgjmuFE=" />

 

                     <table cellspacing="0" rules="all" border="1" id="DataGrid1" style="border-collapse:collapse;Z-INDEX: 101; LEFT: 18px; POSITION: absolute; TOP: 17px">

       <tr>

              <td>OrderID</td>

       </tr><tr>

              <td>10249</td>

       </tr><tr>

              <td>10251</td>

       </tr><tr>

              <td>10258</td>

       </tr><tr>

              <td>10260</td>

       </tr><tr>

              <td>10265</td>

       </tr><tr>

              <td>10267</td>

       </tr><tr>

              <td>10269</td>

       </tr><tr>

              <td>10270</td>

       </tr><tr>

              <td>10274</td>

       </tr><tr>

              <td>10275</td>

       </tr><tr>

              <td colspan="1"><span>1</span></td>

       </tr>

</table>

              </form>

       </body>

</HTML>

看!只是禁用了该网格的 ViewState,同一页面的有效负载就大大减少了:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<HTML>

  <HEAD>

              <title>ViewState1</title>

              <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">

              <meta name="CODE_LANGUAGE" Content="C#">

              <meta name="vs_defaultClientScript" content="JavaScript">

              <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

  </HEAD>

       <body MS_POSITIONING="GridLayout">

              <form name="ViewState1" method="post" action="ViewState1.aspx" id="ViewState1">

<input type="hidden" name="__VIEWSTATE" value="dDwtNDYxODExNjQ5Ozs+XCVfSCiMry39igNrMjifJpG9qIo=" />

 

                     <table cellspacing="0" rules="all" border="1" id="DataGrid1" style="border-collapse:collapse;Z-INDEX: 101; LEFT: 18px; POSITION: absolute; TOP: 17px">

       <tr>

              <td>OrderID</td>

       </tr><tr>

              <td>10249</td>

       </tr><tr>

              <td>10251</td>

       </tr><tr>

              <td>10258</td>

       </tr><tr>

              <td>10260</td>

       </tr><tr>

              <td>10265</td>

       </tr><tr>

              <td>10267</td>

       </tr><tr>

              <td>10269</td>

       </tr><tr>

              <td>10270</td>

       </tr><tr>

              <td>10274</td>

       </tr><tr>

              <td>10275</td>

       </tr><tr>

              <td colspan="1"><span>1</span></td>

       </tr>

</table>

              </form>

       </body>

</HTML>

在上述示例中,我通过将网格的 EnableViewState 属性设置为 False 禁用了 ViewState。大大提高了应用程序的性能。我们还可以针对整个页面或整个应用程序禁用 ViewState,如下所示:

每个页面(在指令中) <%@ Page EnableViewState="False" ?%>

每个应用程序(在 web.config 中) <Pages EnableViewState="false" ?/>  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值