⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perftuning.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 2 页
字号:
<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %>
<%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>

<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->

<h4>性能微调提示</h4>

任何编程模型都有常见的性能缺陷,ASP.NET 也不例外。本节描述一些可避免在代码中出现性能瓶颈的方法。
<p>
<ol>
<li><b>在未使用时禁用会话状态</b>:

并非所有的应用程序或页都要求基于每个用户的会话状态。如果不需要,可将其完全禁用。这可以通过以下页级别指令轻松实现:

<div class="code"><pre>
&lt;%@ Page EnableSessionState="false" %&gt;
</pre></div>

<p>
<b>注意:</b>如果页需要访问会话变量但不创建或修改它们,请将指令值设置为 <i>ReadOnly</i>。还可为 XML Web 服务方法禁用会话状态。请参阅 XML Web 服务一节中的<a href="servicesandobjs.aspx">使用对象和内部对象</a>。
<p>
<li><b>慎重选择会话状态提供程序</b>:

ASP.NET 为存储应用程序的会话数据提供了三种不同的方法:进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL 数据库中的进程外会话状态。每种方法都有自己的优点,但进程内会话状态是迄今为止速度最快的解决方案。如果仅在会话状态中存储少量易失数据,则应使用进程内提供程序。进程外解决方案主要用于 Web 花园和 Web 农场方案,或用于当服务器/进程重新启动时不能丢失数据的情况。
<p>
<li><b>避免与服务器间的过多往返行程</b>:Web 窗体页框架是 ASP.NET 的最佳功能之一,因为它可以显著减少为完成某项任务所需编写的代码量。使用服务器控件和回发事件处理模型的页元素编程访问无疑是最省时的功能。但是,对这些功能的使用存在着适当和不适当的方法,了解何时使用它们是适当的很重要。
<p>
应用程序通常仅在检索数据或存储数据时才需要往返于服务器。多数数据操作可在往返行程间在客户端进行。例如在用户提交数据前,通常可以在客户端验证窗体项。通常,如果不需要将信息中继回服务器,则不应往返于服务器。
<p>
如果编写自己的服务器控件,请考虑让它们为上级(支持 ECMAScript)浏览器呈现客户端代码。通过采用“智能”控件,可显著减少对 Web 服务器的不必要点击次数。
<p>
<li><b>使用 Page.IsPostback 避免往返行程上的额外工作</b>:如果处理服务器控件回发,通常需要在第一次请求页时执行代码,该代码不同于激发事件时用于往返行程的代码。如果检查 <b>Page.IsPostBack</b> 属性,则代码可按条件执行,具体取决于是否有对页的初始请求或对服务器控件事件的响应。这样做似乎很明显,但实际上可以忽略此项检查而不更改页的行为。例如:
<p>

<table cellpadding=0 cellspacing=0 width="93%">
<tr>
<td>
<Acme:TabControl runat="server">
<Tab Name="C#">
&lt;script language="C#" runat="server"&gt;

    public DataSet ds;
    ...

    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();
        }
    }

    void Button_Click(Object sender, EventArgs e) {
        String query = "select * from Authors where FirstName like '%BRAD%'";
        myCommand.Fill(ds, "Authors");
        myDataGrid.DataBind();
    }

&lt;/script&gt;

&lt;form runat="server"&gt;
  &lt;asp:datagrid datasource='&lt;%# ds.DefaultView %&gt;' runat="server"/&gt;&lt;br&gt;
  &lt;asp:button onclick="Button_Click" runat="server"/&gt;
&lt;/form&gt;
</Tab>
<Tab Name="VB">
&lt;script language="VB" runat="server"&gt;

    Public ds As DataSet
    ...

    Sub Page_Load(sender As Object, e As EventArgs)
        ' ...set up a connection and command here...
        If Not (Page.IsPostBack)
            Dim query As String = "select * from Authors where FirstName like '%JUSTIN%'"
            myCommand.Fill(ds, "Authors")
            myDataGrid.DataBind()
        End If
    End Sub

    Sub Button_Click(sender As Object, e As EventArgs)
        Dim query As String = "select * from Authors where FirstName like '%BRAD%'"
        myCommand.Fill(ds, "Authors")
        myDataGrid.DataBind()
    End Sub

&lt;/script&gt;

&lt;form runat="server"&gt;
  &lt;asp:datagrid datasource='&lt;%# ds.Tables["Authors"].DefaultView %&gt;' runat="server"/&gt;&lt;br&gt;
  &lt;asp:button onclick="Button_Click" runat="server"/&gt;
&lt;/form&gt;
</Tab>
<Tab Name="JScript">
&lt;script language="JScript" runat="server"&gt;

    public var ds:DataSet;
    ...

    function Page_Load(sender:Object, e:EventArgs) : void {
        // ...set up a connection and command here...
        if (!Page.IsPostBack) {
            var query:String = "select * from Authors where FirstName like '%JUSTIN%'";
            myCommand.Fill(ds, "Authors");
            myDataGrid.DataBind();
        }
    }

    function Button_Click(sender:Object, e:EventArgs) : void {
        var query:String = "select * from Authors where FirstName like '%BRAD%'";
        myCommand.Fill(ds, "Authors");
        myDataGrid.DataBind();
    }

&lt;/script&gt;

&lt;form runat="server"&gt;
  &lt;asp:datagrid datasource='&lt;%# ds.DefaultView %&gt;' runat="server"/&gt;&lt;br&gt;
  &lt;asp:button onclick="Button_Click" runat="server"/&gt;
&lt;/form&gt;
</Tab>
</Acme:TabControl>
</td>
</tr>
</table>
<p>
<code>Page_Load</code> 事件对所有请求都执行,因此检查了 <b>Page.IsPostBack</b>,以便在处理 <code>Button_Click</code> 事件回发时不执行第一个查询。请注意,即使没有此检查,页的行为也不会改变,因为第一个查询中的绑定会被事件处理程序中的 <b>DataBind</b> 调用推翻。记住,在编写页时会很容易忽略这个简单的性能改进。
<p>
<li><b>谨慎适当地使用服务器控件</b>:尽管服务器控件使用起来非常容易,但它并不总是最佳选择。许多情况下,简单的呈现或数据绑定替换可以完成同样的事情。例如:
<p>

<table cellpadding=0 cellspacing=0 width="93%">
<tr>
<td>
<Acme:TabControl runat="server">
<Tab Name="C#">
&lt;script language="C#" runat="server"&gt;

    public String imagePath;
    void Page_Load(Object sender, EventArgs e) {
        //...retrieve data for imagePath here...
        DataBind();
    }

&lt;/script&gt;

&lt;%-- the span and img server controls are unecessary...--%&gt;
The path to the image is: &lt;span innerhtml='&lt;%# imagePath %&gt;' runat="server"/&gt;&lt;br&gt;
&lt;img src='&lt;%# imagePath %&gt;' runat="server"/&gt;

&lt;br&gt;&lt;br&gt;

&lt;%-- use databinding to substitute literals instead...--%&gt;
The path to the image is: &lt;%# imagePath %&gt;&lt;br&gt;
&lt;img src='&lt;%# imagePath %&gt;' /&gt;

&lt;br&gt;&lt;br&gt;

&lt;%-- or a simple rendering expression...--%&gt;
The path to the image is: &lt;%= imagePath %&gt;&lt;br&gt;
&lt;img src='&lt;%= imagePath %&gt;' /&gt;
</Tab>
<Tab Name="VB">
&lt;script language="VB" runat="server"&gt;

    Public imagePath As String
    Sub Page_Load(sender As Object, e As EventArgs)
        '...retrieve data for imagePath here...
        DataBind()
    End Sub

&lt;/script&gt;

&lt;%--the span and img server controls are unecessary...--%&gt;
The path to the image is: &lt;span innerhtml='&lt;%# imagePath %&gt;' runat="server"/&gt;&lt;br&gt;
&lt;img src='&lt;%# imagePath %&gt;' runat="server"/&gt;

&lt;br&gt;&lt;br&gt;

&lt;%-- use databinding to substitute literals instead...--%&gt;
The path to the image is: &lt;%# imagePath %&gt;&lt;br&gt;
&lt;img src='&lt;%# imagePath %&gt;' /&gt;

&lt;br&gt;&lt;br&gt;

&lt;%-- or a simple rendering expression...--%&gt;
The path to the image is: &lt;%= imagePath %&gt;&lt;br&gt;
&lt;img src='&lt;%= imagePath %&gt;' /&gt;
</Tab>
<Tab Name="JScript">
&lt;script language="JScript" runat="server"&gt;

    public var imagePath:String;
    function Page_Load(sender:Object, e:EventArgs) : void {
        //...retrieve data for imagePath here...
        DataBind();
    }

&lt;/script&gt;

&lt;%-- the span and img server controls are unecessary...--%&gt;
The path to the image is: &lt;span innerhtml='&lt;%# imagePath %&gt;' runat="server"/&gt;&lt;br&gt;
&lt;img src='&lt;%# imagePath %&gt;' runat="server"/&gt;

&lt;br&gt;&lt;br&gt;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -