技巧 改進效能和樣式的 25+ ASP 技巧
-------------------------------
Len Cardinal - Microsoft Consulting Services 進階顧問
George V. Reilly - Microsoft IIS Performance 主管
更新時間:2000年4月
根據 Nancy Cluts 的文章(英文)改寫
Nancy Cluts - 開發人員技術工程師
Microsoft Corporation
摘要:本文提供了最佳化 ASP 應用程式和 VBScript 的技巧。
目錄
簡介
技巧 1:在 Web 服務器上緩衝常用資料
技巧 2:在 Application 或 Session 對象中緩衝常用資料
技巧 3:在 Web 服務器磁碟上快取資料和 HTML
技巧 4:避免在 Application 或 Session 對象中緩衝非靈活組件
技巧 5:不要在 Application 或 Session 對象中快取資料庫串連
技巧 6:妙用 Session 對象
技巧 7:在 COM 物件中封裝代碼
技巧 8:晚點擷取資源,早點釋放資源
技巧 9:進程外的執行將犧牲可靠性
技巧 10:顯式使用選項
技巧 11:在子常式和函數中使用局部變數
技巧 12:將常用資料複製到指令碼變數
技巧 13:避免重新定義數組
技巧 14:使用響應緩衝
技巧 15:批處理內嵌指令碼和 Response.Write 語句
技巧 16:在開始長時間的任務之前先使用 Response.IsClientConnected
技巧 17:使用 <OBJECT> 標記執行個體化對象
技巧 18:使用 ADO 對象和其他組件的 TypeLib 綁定
技巧 19:利用瀏覽器的驗證能力
技巧 20:在迴圈中避免字串串聯
技巧 21:啟用瀏覽器和代理緩衝
技巧 22:儘可能使用 Server.Transfer 替代 Response.Redirect
技巧 23:在目錄 URL 尾部加斜線
技巧 24:避免使用伺服器變數
技巧 25:升級為最新的和最好的版本
技巧 26:調整 Web 服務器
技巧 27:進行效能測試
技巧 28:讀取資源連結
簡介
效能是一個特性。您需要預先設計效能,或是在日後重新編寫應用程式。換句話說,什麼是最大限度最佳化 Active Server Pages (ASP) 應用程式效能的好策略?
本文為最佳化 ASP 應用程式和“Visual Basic(R) 指令碼編輯器 (VBScript)”提供了許多技巧。對許多陷阱和缺陷進行了討論。本文所列的建議均在 http://www.microsoft.com 及其他網站上進行了測試,而且工作正常。本文假定您對 ASP 開發有基本的理解,包括對 VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 內部對象(請求、響應和伺服器)。
ASP 的效能,通常不止取決於 ASP 代碼本身。我們並不想在一篇文章中囊括所有的至理名言,只在最後列出與效能相關的資源。這些連結包括 ASP 和非 ASP 主題,包括“ActiveX(R) 資料對象 (ADO)”、“組件物件模型 (COM)”、資料庫和“Internet 資訊服務器 (IIS)”配置。這些是我們喜歡的連結 - 務請關注它們。
技巧 1:在 Web 服務器上緩衝常用資料
典型的 ASP 頁從後端資料庫檢索資料,然後將結果轉換為超文字標記語言 (HTML) (HTML)。無論資料庫的速度如何,從記憶體檢索資料要比從後端資料庫檢索資料快得多。從本地硬碟讀取資料通常也要比從資料庫檢索資料快得多。因此,通常可以通過在 Web 服務器(在記憶體或磁碟)上快取資料來改善效能。
緩衝是典型的空間與時間的折衷。如果恰當地快取資料,您將看到效能會有驚人的提高。為使緩衝發揮效力,它必須保持經常重用的資料,而且重新計算這些資料的代價是昂貴的或比較昂貴的。如果緩衝充滿了垃圾資料,則是對儲存空間的浪費。
不經常變化的資料也是緩衝的候選資料,因為您無須擔心資料與資料庫的同步問題。組合框、參考資料表、DHTML 片段、可延伸標記語言 (XML) (XML) 字串、功能表項目和網站組態變數(包括資料來源名稱 (DSN)、網際網路通訊協定 (IP) (IP) 地址和 Web 路徑)都是緩衝的候選資料。注意,您可以快取資料的表示而不是資料本身。如果 ASP 頁不經常更改,而且緩衝的成本也非常高(例如,整個產品目錄),請考慮預先產生 HTML,而不是在每次請求時重新繪製。
資料應緩衝在何處,有哪些緩衝策略?資料經常緩衝在 Web 服務器記憶體或 Web 服務器磁碟上。下面兩個技巧討論這些選項。
技巧 2:在 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 函數(不顯示)
' 從 DB 中取出資料,返回數組
d = FetchEmploymentStatusList()
Application("EmploymentStatusList") = d
End If
GetEmploymentStatusList = d
End Function
%>
可以為每一塊所需的資料編寫類似的函數。
資料應該以什麼格式儲存?任何變數類型均可儲存,因為所有指令碼變數是各不相同的。例如,可以儲存字串、整型或數組。通常,您將以這些變數類型之一儲存 ADO 記錄集的內容。若要擷取 ADO 記錄集衍生的資料,可以手工將資料複製到 VBScript 變數中,每次一個欄位。使用一個 ADO 記錄集保留函數 GetRows()、GetString() 或 Save() (ADO 2.5),會更快更簡便。完整而詳細的內容已超出了本文的範圍。下面的示範函數使用了 GetRows() 來返回記錄集資料的數組:
' 取記錄集,以數組返回
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList = rs.GetRows() ' 以數組返回資料
rs.Close
Set rs = Nothing
End Function
對上面樣本的進一步改進應當是緩衝該列表的 HTML,而不是緩衝數組。下面是一個簡單的範例:
' 取記錄集,以“HTML 選項”列表返回
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = CreateObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
s = "<select name=""EmploymentStatus">" & vbCrLf
Set fldName = rs.Fields("StatusName") ' ADO 欄位綁定
Do Until rs.EOF
' 下