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

📄 perftuning.aspx

📁 书籍教程 >> .Net教程 >> asp.net编程精彩百例
💻 ASPX
📖 第 1 页 / 共 2 页
字号:
<%-- use databinding to substitute literals instead...--%>
The path to the image is: <%# imagePath %><br>
<img src='<%# imagePath %>' />

<br><br>

<%-- or a simple rendering expression...--%>
The path to the image is: <%= imagePath %><br>
<img src='<%= imagePath %>' />
</Tab>
</Acme:TabControl>
</td>
</tr>
</table>
<p>

在此示例中,不需要服务器控件将值代入发送回客户端的结果 HTML。在许多其他情况下此方法同样适用,甚至在服务器控件模板中。但是,如果要以编程方式操作控件属性、从中处理事件或利用其状态保存,则服务器控件更合适。应检查服务器控件的使用,并查找可优化的代码。
<p>
<li><b>避免过多的服务器控件视图状态</b>:自动状态管理是一种功能,它使服务器控件能够在往返行程中重新填充它们的值,而不要求编写任何代码。但是,此功能并不能任意使用,因为控件状态是在隐藏的窗体字段中传入和传出服务器的。应当明白 <b>ViewState</b> 何时有帮助,何时没有。例如,如果在每个往返行程中将控件绑定到数据(如第四条提示中的数据网格示例所示),则不要求控件维护它的视图状态,因为无论如何都将擦除任何重新填充的数据。
<p>
默认情况下,为所有的服务器控件启用 <b>ViewState</b>。若要禁用它,请将控件的 <b>EnableViewState</b> 属性设置为 false,如下例所示:
<p>
<div class="code"><pre>
&lt;asp:datagrid EnableViewState="false" datasource="..." runat="server"/&gt;
</pre></div>
<p>
还可在页级别关闭 <b>ViewState</b>。这在根本不从页回发时非常有用,如下例所示:
<p>
<div class="code"><pre>
&lt;%@ Page EnableViewState="false" %&gt;
</pre></div>
注意,<b>User Control</b> 指令也支持此属性。若要分析页上的服务器控件使用的视图状态量,请启用跟踪并查看“控件层次结构”表中的“视图状态”列。有关跟踪功能及如何启用它的更多信息,请参阅<a href="tracelogapp.aspx">应用程序级别的跟踪记录</a>功能。

<p>
<li><b>对字符串连接使用 Response.Write</b>:在页面或用户控件中对字符串连接使用 HttpResponse.Write 方法。该方法提供非常有效的缓冲和连接服务。但是,如果您打算执行大量的连接,则使用下列示例中的方法(即多次调用 <b>Response.Write</b>)来连接字符串比仅调用一次 <b>Response.Write</b> 方法要快。 
<p>

<table cellpadding=0 cellspacing=0 width="93%">
<tr>
<td>
<Acme:TabControl runat="server">
<Tab Name="C#">
Response.Write("a");
Response.Write(myString);
Response.Write("b");
Response.Write(myObj.ToString());
Response.Write("c");
Response.Write(myString2);
Response.Write("d");
</Tab>
<Tab Name="VB">
Response.Write("a")
Response.Write(myString)
Response.Write("b")
Response.Write(myObj.ToString())
Response.Write("c")
Response.Write(myString2)
Response.Write("d")
</Tab>
<Tab Name="JScript">
Response.Write("a");
Response.Write(myString);
Response.Write("b");
Response.Write(myObj.ToString());
Response.Write("c");
Response.Write(myString2);
Response.Write("d");
</Tab>
</Acme:TabControl>
</td>
</tr>
</table>

<p>
<li><b>不要依赖代码中的异常</b>:异常非常浪费资源,应在代码中尽量避免。绝不要将异常作为控制常规程序流的方法。如果可以在代码中检测到会导致异常的条件,就应该那样做,而不要等到捕捉异常后再处理该条件。常见的方案包括:检查空值,分配给将分析为数字值的字符串,或在应用数学运算前检查特定值。例如:
<p>
<table cellpadding=0 cellspacing=0 width="93%">
<tr>
<td>
<Acme:TabControl runat="server">
<Tab Name="C#">
// Consider changing this:

try {
   result = 100 / num;
}
catch (Exception e) {
  result = 0;
}

// To this::

if (num != 0)
   result = 100 / num;
else
  result = 0;

</Tab>
<Tab Name="VB">
' Consider changing this:

Try
   result = 100 / num

Catch (e As Exception)
  result = 0
End Try

// To this:

If Not (num = 0)
   result = 100 / num
Else
  result = 0
End If
</Tab>
<Tab Name="JScript">
// Consider changing this:

try {
   result = 100 / num;
}
catch (e:Exception) {
  result = 0;
}

// To this:

if (num != 0)
   result = 100 / num;
else
  result = 0;

</Tab>
</Acme:TabControl>
</td>
</tr>
</table>

<p>
<li><b>在 Visual Basic 或 JScript 代码中使用早期绑定</b>:Visual Basic、VBScript 和 JScript 的优点之一是它们无类型的特性。只需使用它们即可创建变量,并不需要显式的类型声明。从一种类型分配到另一种类型时,同样会自动执行转换。这既是优点也是缺点,因为就性能而言,晚期绑定虽很方便但很昂贵。
<p>
Visual Basic 语言现在通过使用特殊的 <b>Option Strict</b> 编译器指令来支持类型安全编程。为了向后兼容,默认情况下 ASP.NET 不启用 <b>Option Strict</b>。但为了获得最佳性能,应在页上使用 <b>Strict</b> 属性或使用 Control 指令,为页启用 <b>Option Strict</b>:
<p>
<div class="code"><pre>
&lt;%@ Page Language="VB" Strict="true" %&gt;

&lt;%

Dim B
Dim C As String

' This causes a compiler error:
A = "Hello"

' This causes a compiler error:
B = "World"

' This does not:
C = "!!!!!!"

' But this does:
C = 0

%&gt;
</pre></div>
<p>
JScript 也支持无类型编程,但它不提供强制早期绑定的编译器指令。满足以下条件的变量是后期绑定的:
<p>
<ul>
<li>被显式声明为对象。
<li>是无类型声明的类的字段。
<li>是无显式类型声明的专用函数/方法成员,并且无法从其使用推断出类型。
</ul>
<p>
最后一个特点非常复杂。如果 JScript 编译器能够根据使用变量的方式推断出其类型就会进行优化。在下面的示例中,变量 <i>A</i> 为早期绑定,而变量 <i>B</i> 为后期绑定:
<p>
<div class="code"><pre>
var A;
var B;

A = "Hello";
B = "World";
B = 0;
</pre></div>
<p>
为获得最佳性能,请将 JScript 变量声明为具有类型。例如,“var A : String”。

<p>
<li><b>将大量调用的 COM 组件移植为托管代码</b>:.NET 框架一种非常容易的方法与传统的 COM 组件相互操作。其优点是可以在保留现有代码的同时利用新的平台。但是,在某些情况下,保留旧组件的性能成本超出了将组件迁移到托管代码的费用。每种情况都非常特别,而决定所需更改的内容的最佳方法是测量站点的性能。但是,通常 COM 交互性的性能影响与函数调用的次数或从非托管代码封送到托管代码的数据量成比例。由于各层间的通讯数,需要同大量调用交互的组件称为“chatty”。应考虑将这种组件移植为完全托管的代码,以从 .NET 平台提供的性能收益中获益。或者可以考虑重新设计组件,以请求更少的调用或一次封送更多数据。
<p>
<li><b>将 SQL 存储过程用于数据访问</b>:在 .NET 框架提供的所有数据访问方法中,基于 SQL 的数据访问是生成性能最好的可缩放 Web 应用程序的最佳选择。使用托管 SQL 提供程序时,可通过使用编译的存储过程而不是特殊查询,获得额外的性能提高。有关使用 SQL 存储过程的示例,请参考本教程的<a href="webdataaccess.aspx">服务器端的数据访问</a>一节。
<p>
<li><b>使用 SqlDataReader 获得快进只读数据游标</b>:<b>SqlDataReader</b> 对象对从 SQL 数据库中检索的数据提供前进只读游标。如果 <b>SqlDataReader</b> 适合于您的情况,则它是一个比 <b>DataSet</b> 更好的选择。因为 <b>SqlDataReader</b> 支持 <b>IEnumerable</b> 接口,甚至还可以绑定服务器控件。有关使用 <b>SqlDataReader</b> 的示例,请参阅本教程的<a href="webdataaccess.aspx">服务器端数据访问</a>一节。
<p>
<li><b>尽可能缓存数据和输出</b>:ASP.NET 编程模型提供了一个简单的机制,在不需要为每个请求动态计算页输出或数据时缓存它们。在设计页时可以考虑用缓存来优化应用程序中那些预期有最大通信量的地方。适当地使用缓存可增强站点的性能,有时甚至可以增大一个数量级或更多,这是 .NET 框架的任何其他功能无法企及的。有关如何使用缓存的更多信息,请参阅本教程的<a href="cachingoverview.aspx">缓存服务</a>一节。
<p>
<li><b>为多处理器计算机启用 Web 花园</b>:ASP.NET 进程模型帮助在多处理器计算机上启用可缩放性,将工作分发给多个进程(每个 CPU 一个),并且每个进程都将处理器关系设置为其 CPU。该技术称为 <i>Web 园艺</i>,它可以显著提高某些应用程序的性能。若要了解如何启用 Web 园艺,请参考<a href="procmodel.aspx">使用进程模型</a>一节。
<p>
<li><b>不要忘记禁用调试模式</b>:ASP.NET 配置中的 <b>&lt;compilation&gt;</b> 节控制应用程序是否在调试模式中编译。调试模式严重降低性能。在部署生产应用程序或测量性能之前,始终记住禁用调试模式。有关调试模式的更多信息,请参考题为 <a href="debugcomsdk.aspx">SDK 调试器</a>的章节。
<p>
</ol>

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

⌨️ 快捷键说明

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