微軟建議的ASP優化性能28條守則(5)
發表時間:2024-02-07 來源:明輝站整理相關軟件相關文章人氣:
[摘要]技巧 13:避免重新確定數組的維數 應盡量避免 Redim 數組。就性能而言,如果計算機的物理內存大小有限,最好將數組的初始維數設置為其最不利的情況 - 或將維數設置為其最佳的情況,然后再按需要重新確定維數。這并非意味著,如果知道您不需要內存時,就隨便分配幾兆字節的內存。 下面的代碼給您顯示使用 ...
技巧 13:避免重新確定數組的維數
應盡量避免 Redim 數組。就性能而言,如果計算機的物理內存大小有限,最好將數組的初始維數設置為其最不利的情況 - 或將維數設置為其最佳的情況,然后再按需要重新確定維數。這并非意味著,如果知道您不需要內存時,就隨便分配幾兆字節的內存。
下面的代碼給您顯示使用 Dim 和 Redim 不當的情形。
<%
Dim MyArray()
Redim MyArray(2)
MyArray(0) = ?hello?
MyArray(1) = ?good-bye?
MyArray(2) = ?farewell?
...
' some other code where you end up needing more space happens, then ...
Redim Preserve MyArray(5)
MyArray(3) = ?more stuff?
MyArray(4) = ?even more stuff?
MyArray(5) = ?yet more stuff?
%>
最好一開始就將數組的初始大小 Dim 正確(在本例中,是 5)比 Redim 數組使其更大好得多。您可能浪費一些內存(如果您沒有使用所有的元素),但獲得的好處是速度變得更快。
技巧 14:使用響應緩沖
您可以通過啟用“響應緩沖”,將要輸出的一整頁緩沖起來。這樣就將寫到瀏覽器的量減到最少,從而改善總體性能。每個寫操作都會產生很大的系統開銷(在 IIS 中以及在通過網絡發送的數據量方面),因此寫操作越少越好。由于其啟動慢且使用 Nagling 算法(用來減輕網絡塞車情況),TCP/IP 在發送一些大的數據塊時比必須發送許多小的數據塊時的效率高得多。
有兩個方法啟用響應緩沖。第一種,您可以使用 Internet Services Manager 為整個應用程序啟用響應緩沖。我們建議采用這種方法,在 IIS 4.0 和 IIS 5.0 中默認為新的 ASP 應用程序啟用響應緩沖。第二種,可以在每個 ASP 頁面的接近頂端的地方加入下面的代碼行,從而啟用響應緩沖:
<% Response.Buffer = True %>
此代碼行必須在任何響應數據被寫到瀏覽器之前執行(即,在任何 HTML 出現在 ASP 腳本之前以及在使用 Response.Cookies 集合設置任何 Cookies 之前)。一般來說,最好為整個應用程序啟用響應緩沖。這樣,您就不必在每個頁面最上面寫入上述的代碼行。
Response.Flush
關于響應緩沖有一個常見的抱怨,就是用戶感覺到 ASP 頁面的響應速度很慢(即使整個響應時間得到改進),因為他們必須等到整個頁面生成,然后他們才能看到東西。對于運行時間長的頁面,您可以設置 Response.Buffer = False,禁用響應緩沖。但是,一個更好的策略是利用 Response.Flush 方法。這種方法將 ASP 轉換的所有 HTML 送到瀏覽器。例如,在轉換 1,000 行的表的前 100 行之后,ASP 可以調用 Response.Flush,強制將轉換的結果送到瀏覽器,這樣可使用戶在其余的行準備好之前看到頭 100 行。這種技術可以將響應緩沖與瀏覽器逐漸顯示數據完美地結合在一起。
(注意在上面的 1,000 行表的舉例中,許多瀏覽器在它們看到關閉 </table> 標記之前不會開始顯示表。檢查您的目標瀏覽器是否支持。為避免這種情況,將表分成多個具有較少行的表,并在每個表之后調用 Response.Flush。較新版本的 Internet Explorer 在表完全下載之前就開始顯示表,如果您指定表列寬,顯示速度就會特別快,這樣做可避免強制 Internet Explorer 通過測量每個單元格的內容寬度來計算列寬。)
另一個關于響應緩沖的常見的抱怨是,當產生非常大的頁面時,將占用許多服務器內存。撇開產生大頁面的方法不談,這種問題也可通過巧妙使用 Response.Flush 來加以解決。
技巧 15:批處理內嵌腳本和 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 塊內:
<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
%>
</table>
當禁用響應緩沖時,這一技巧的效果特別大。最好啟用響應緩沖,然后看批處理 Response.Write 是否有助于提高性能。
(在這一特定舉例中,建立表主體的嵌套循環 (While Not rs.EOF...) 可以用仔細構建的 GetString 調用來替代。)