`
isiqi
  • 浏览: 16004917 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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" ?/>

分享到:
评论

相关推荐

    利用缓存优化基于ASP.NET的Web GIS性能

    随着Web GIS的快速发展和广泛...虽然ASP.NET页面是编译型的。但页面中的许多操作将占用大量的服务器资源。因此有必要用运ASP.NET的缓存技术,降低Web GIS服务器的负载,使得设计和实现的Web GIS性能更优,效率更高

    ASP.NET网络在线考试系统(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET图书馆管理信息系统(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    asp.net通讯录管理系统课程设计.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net医药进销存系统.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net企业客户管理系统cms系统.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net+sql2008在线论坛系统.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net-sql2008公司人事管理系统.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net选课系统毕业设计全套参考资料.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET基于.NET的城市公交查询系统的设计与实现(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET-某企业信息管理系统的设计与实现(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net学生信息系统(适合课程设计).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET报名系统(源代码+thesis)、.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET学生成绩管理系统(thesis+系统).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net学生管理系统(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    [信息办公]Asp.net通用OA系统_uds.zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    Asp.net在线考勤系统研发(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    asp.net学生成绩管理系统(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

    ASP.NET学生信息管理系统(源代码+thesis).zip

    缓存管理:为了提高应用程序的性能,我们将使用ASP.NET提供的缓存机制来缓存常用的数据和页面。这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程...

Global site tag (gtag.js) - Google Analytics