微軟|效能|最佳化|微軟|效能|最佳化
目錄
技巧 1:將經常使用的資料緩衝在 Web 服務器上
技巧 2:將經常使用的資料緩衝在 Application 或 Session 對象中
技巧 3:將資料和 HTML 緩衝在 Web 服務器的磁碟上
技巧 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® Scripting Edition (VBScript) 的技巧。本文討論了許多陷阱。本文列出的建議已經在 http://www.microsoft.com 和其它網站中進行了測試,效果十分顯著。本文假定您已經對 ASP 開發,包括 VBScript 和/或 JScript、ASP Application、ASP Session 和其它 ASP 固有對象(Request、Response 和 Server)有了基本瞭解。
通常,ASP 效能主要取決於 ASP 代碼本身以外的很多因素。我們不在一篇文章中羅列出所有的資訊,在本文結尾處我們列出了與效能有關的資源。這些連結涵蓋了 ASP 和非 ASP 主題,包括 ActiveX® 資料對象 (ADO)、元件物件模型 (COM)、資料庫和 Internet Information Server (IIS) 配置。這些都是我們喜歡的一些連結 - 一定要去看看。
技巧 1:將經常使用的資料緩衝在 Web 服務器上
典型的 ASP 頁從後端資料存放區中檢索資料,然後將結果轉換成超文字標記語言 (HTML) (HTML)。無論資料庫的速度如何,從記憶體中檢索資料總要比從後端資料存放區中檢索資料快得多。從本地硬碟讀取資料通常也比從資料庫中檢索資料更快。因此,通常可以將資料緩衝在 Web 服務器上(儲存在記憶體或磁碟中),來提高效能。
緩衝是傳統的以空間換取時間的做法。如果您緩衝的內容正確,那麼您可以看到效能會有顯著的提高。為使緩衝有效,必須儲存那些經常重複使用的資料,且要重新計算這些資料需要(適度)大的開銷。如果緩衝的都是些陳舊的資料,就會造成記憶體浪費。
不經常發生改變的資料是很好的緩衝候選資料,因為您不必擔心隨著時間的遷移該資料與資料庫同步的問題。組合框列表、參考資料表、DHTML 片段、擴充標記語言 (XML) 字串、功能表項目和網站組態變數(包括資料來源名稱 (DSN)、網際網路通訊協定 (IP) (IP) 地址和 Web 路徑)都是很好的緩衝候選內容。注意您可以快取資料的“表示”,而不快取資料本身。如果 ASP 頁很少更改,且緩衝的開銷也很大(例如,整個產品目錄),則應考慮事先產生 HTML,而不是在響應每個請求時重新顯示。
應將資料緩衝在哪裡,有哪些緩衝策略?通常,資料緩衝在 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 function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application(?EmploymentStatusList?) = d
End If
GetEmploymentStatusList = d
End Function
%>
可以為所需要的每個資料區塊編寫類似的函數。
應以什麼格式儲存資料?可以儲存任何變體類型,因為所有指令碼變數都是變體型。例如,您可以儲存字串、整數或數組。通常,您將以這些變數類型之一儲存 ADO 記錄集的內容。要從 ADO 記錄集擷取資料,您可以手工將資料複製到 VBScript 變數,一次一個欄位。使用一個 ADO 記錄集持久函數 GetRows()、GetString() 或 Save()(ADO 2.5),可加快速度且更容易一些。其詳細情況已超出本文所討論的範圍,但下面給出了一個函數舉例,說明使用 GetRows() 返回記錄集資料的一個數組:
' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject(?ADODB.Recordset?)
rs.Open ?select StatusName, StatusID from EmployeeStatus?, _
?dsn=employees;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ? Return data as an Array
rs.Close
Set rs = Nothing
End Function
對上面舉例做更進一步改進,可以將 HTML 緩衝為列表,而不是數組。下面是簡單的樣本:
' Get Recordset, return as HTML Option list
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 Field Binding
Do Until rs.EOF
' Next line violates Don't Do String Concats,
' but it's OK because we are building a cache
s = s & ? <option>? & fldName & ?</option>? & vbCrLf
rs.MoveNext
Loop
s = s & ?</select>? & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function
在適當的條件下,可以將 ADO 記錄集本身緩衝在 Application 或 Session 範圍中。有兩個警告:
必須將 ADO 標記為自由線程
必須使用中斷連線的記錄集。
如果不能保證滿足這兩個要求,則不要緩衝 ADO 記錄集。在下面的“非敏捷組件”和“不要緩衝串連”技巧中,我們將討論將 COM 物件儲存在 Application 或 Session 範圍中的危險性。
當您將資料存放區在 Application 或 Session 範圍時,資料將保留在那裡,直到您以編程方式改變它、Session 到期或 Web 應用程式重新啟動為止。如果資料需要更新怎麼辦?要手工強制對 Application 資料進行更新,您可以訪問只有管理員才可訪問的 ASP 頁來更新資料。或者,您可以通過函數定期自動重新整理資料。下面例子儲存帶有快取資料的時間戳記,並隔一段時間後重新整理資料。
<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 '