四招幫你優(yōu)化ASP程序
1.將經(jīng)常使用的數(shù)據(jù)緩存在 Application 或 Session 對(duì)象中
ASP的Application和Session對(duì)象為將數(shù)據(jù)暫存在內(nèi)存中提供了方便的容器。你可以將數(shù)據(jù)指派到 Application和Session對(duì)象中,這些數(shù)據(jù)在HTTP調(diào)用之前保留在內(nèi)存中。Session數(shù)據(jù)是按每個(gè)用戶(hù)分別存儲(chǔ)的,而Application數(shù)據(jù)則在所有用戶(hù)之間共享。
什么時(shí)候?qū)?shù)據(jù)裝載到 Application 或 Session 中呢?通常,數(shù)據(jù)是在啟動(dòng) Application 或 Session 時(shí)裝載。要在Application或Session啟動(dòng)過(guò)程中裝載數(shù)據(jù),應(yīng)將適當(dāng)?shù)拇a分別添加到Application_OnStart()或Session_OnStart()中。這些函數(shù)應(yīng)該在 Global.asa 中,如果沒(méi)有,我們可手工添加進(jìn)這些函數(shù)。還可以在第一次需要時(shí)裝載該數(shù)據(jù)。為此,在 ASP 頁(yè)中添加一些代碼(或編寫(xiě)一個(gè)可重復(fù)使用的腳本函數(shù)),以檢查數(shù)據(jù)是否存在,如果不存在,就裝載數(shù)據(jù)。這是一個(gè)傳統(tǒng)提高性能的技術(shù),稱(chēng)為“惰性計(jì)算”,即在你知道需要某一個(gè)值以前不計(jì)算該值。程序舉例如下:
<%
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
%>
我們可以為所需要的每個(gè)數(shù)據(jù)塊編寫(xiě)類(lèi)似的函數(shù)。
2.將代碼封裝在 COM 對(duì)象中
如果你的Web應(yīng)用程序中有許多 VBScript 或JScript代碼,你可以經(jīng)常將代碼移到編譯的 COM 對(duì)象中,從而可改善性能。將代碼封裝在 COM 對(duì)象中還有一些除提高性能之外的其他優(yōu)點(diǎn):
。1)COM 對(duì)象有利于將表示邏輯與業(yè)務(wù)邏輯分開(kāi);
。2)COM 對(duì)象可以保證代碼重復(fù)使用;
(3)用VB、VC++ 或 Visual J++ 編寫(xiě)的代碼比 ASP 更容易調(diào)試。
COM對(duì)象也有缺點(diǎn),包括初始化時(shí)間長(zhǎng)和需要不同的程序設(shè)計(jì)技巧。值得注意的是,在少量ASP代碼被封裝進(jìn) COM 對(duì)象時(shí),可能不會(huì)使性能有所改進(jìn),反而會(huì)引起性能下降。這種情況通常是創(chuàng)建和調(diào)用 COM 對(duì)象的系統(tǒng)開(kāi)銷(xiāo)超過(guò)了編譯代碼的系統(tǒng)開(kāi)銷(xiāo)。因此,我們需要反復(fù)地試驗(yàn),以確定什么樣的 ASP 腳本和 COM 對(duì)象代碼的組合可以產(chǎn)生最好的性能。
3.處理內(nèi)嵌腳本和Response.Write語(yǔ)句
VBScript 語(yǔ)法的<% = expression %>是將“expression”的值寫(xiě)到ASP輸出流中。如果響應(yīng)緩沖未啟用,那么執(zhí)行其中的每一條語(yǔ)句都會(huì)以許多小的數(shù)據(jù)包通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)寫(xiě)到瀏覽器中。這樣,執(zhí)行速度很慢,而且穿插執(zhí)行少量的腳本和 HTML,將會(huì)引起腳本引擎和 HTML 之間的切換,從而極大地降低了性能。因此,我們可以使用下面的技巧,即使用 Response.Write 調(diào)用代替捆綁緊密的內(nèi)嵌表達(dá)式。
例如,在下面的示例中,在每一行的每一字段對(duì)響應(yīng)流有一次寫(xiě)操作,每一行在 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>
為了使上面的代碼運(yùn)行效率更高,我們可以利用下面的代碼,代碼的每一行對(duì)響應(yīng)流有一次寫(xiě)操作,所有的代碼都包含在一個(gè)VBScript程序內(nèi):
<%
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>?)
%>
當(dāng)禁用響應(yīng)緩沖時(shí),這一技巧的效果特別明顯。最好啟用響應(yīng)緩沖,然后看批處理 Response.Write 是否有助于提高性能。
4.避免重新確定數(shù)組的維數(shù)
在應(yīng)用數(shù)組時(shí),我們應(yīng)盡量避免使用Redim數(shù)組。就性能而言,如果計(jì)算機(jī)的物理內(nèi)存大小有限,最好將數(shù)組的初始維數(shù)設(shè)置為其最不利的情況,或者將維數(shù)設(shè)置為其最佳的情況,然后再按需要重新確定維數(shù)。
在開(kāi)發(fā)ASP的Web應(yīng)用程序過(guò)程中,充分利用以上技巧會(huì)使你的Web程序具有較高的執(zhí)行性能。