四招帮你优化ASP程序
1.将经常使用的数据缓存在 Application 或 Session 对象中
ASP的Application和Session对象为将数据暂存在内存中提供了方便的容器。你可以将数据指派到 Application和Session对象中,这些数据在HTTP调用之前保留在内存中。Session数据是按每个用户分别存储的,而Application数据则在所有用户之间共享。
什么时候将数据装载到 Application 或 Session 中呢?通常,数据是在启动 Application 或 Session 时装载。要在Application或Session启动过程中装载数据,应将适当的代码分别添加到Application_OnStart()或Session_OnStart()中。这些函数应该在 Global.asa 中,如果没有,我们可手工添加进这些函数。还可以在第一次需要时装载该数据。为此,在 ASP 页中添加一些代码(或编写一个可重复使用的脚本函数),以检查数据是否存在,如果不存在,就装载数据。这是一个传统提高性能的技术,称为“惰性计算”,即在你知道需要某一个值以前不计算该值。程序举例如下:
<%
Function GetEmploymentStatusList
Dim d
d = Application(?EmploymentStatusList?)
If d = ?? Then
' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application(?EmploymentStatusList?) = d
End If
GetEmploymentStatusList = d
End Function
%>
我们可以为所需要的每个数据块编写类似的函数。
2.将代码封装在 COM 对象中
如果你的Web应用程序中有许多 VBScript 或JScript代码,你可以经常将代码移到编译的 COM 对象中,从而可改善性能。将代码封装在 COM 对象中还有一些除提高性能之外的其他优点:
(1)COM 对象有利于将表示逻辑与业务逻辑分开;
(2)COM 对象可以保证代码重复使用;
(3)用VB、VC++ 或 Visual J++ 编写的代码比 ASP 更容易调试。
COM对象也有缺点,包括初始化时间长和需要不同的程序设计技巧。值得注意的是,在少量ASP代码被封装进 COM 对象时,可能不会使性能有所改进,反而会引起性能下降。这种情况通常是创建和调用 COM 对象的系统开销超过了编译代码的系统开销。因此,我们需要反复地试验,以确定什么样的 ASP 脚本和 COM 对象代码的组合可以产生最好的性能。
3.处理内嵌脚本和Response.Write语句
VBScript 语法的<% = expression %>是将“expression”的值写到ASP输出流中。如果响应缓冲未启用,那么执行其中的每一条语句都会以许多小的数据包通过网络将数据写到浏览器中。这样,执行速度很慢,而且穿插执行少量的脚本和 HTML,将会引起脚本引擎和 HTML 之间的切换,从而极大地降低了性能。因此,我们可以使用下面的技巧,即使用 Response.Write 调用代替捆绑紧密的内嵌表达式。
例如,在下面的示例中,在每一行的每一字段对响应流有一次写操作,每一行在 VBScript 和 HTML 之间有多次切换:
<table>
<% For Each fld in rs.Fields %>
<th><% = fld.Name %></th>
<%
Next
While Not rs.EOF
%>
<tr>
<% For Each
fld in rs.Fields %>
<td><% = fld.Value %></td>
<% Next
</tr>
<% rs.MoveNext Wend %>
</table>
为了使上面的代码运行效率更高,我们可以利用下面的代码,代码的每一行对响应流有一次写操作,所有的代码都包含在一个VBScript程序内:
<%
Response.Write(?<table>?)
For each fld in rs.Fields
Response.Write (?<th>? && fld.Name && ?</th>? && vbCrLf)
Next
While Not rs.EOF
Response.Write (?<tr>?)
For Each fld in rs.Fields %>
Response.Write(?<td>? && fld.Value && ?</td>? && vbCrLf)
Next
Response.Write(?</tr>?)
Wend
Response.Write(?</table>?)
%>
当禁用响应缓冲时,这一技巧的效果特别明显。最好启用响应缓冲,然后看批处理 Response.Write 是否有助于提高性能。
4.避免重新确定数组的维数
在应用数组时,我们应尽量避免使用Redim数组。就性能而言,如果计算机的物理内存大小有限,最好将数组的初始维数设置为其最不利的情况,或者将维数设置为其最佳的情况,然后再按需要重新确定维数。
在开发ASP的Web应用程序过程中,充分利用以上技巧会使你的Web程序具有较高的执行性能。