大多數Active Server Pages (ASP) 應用程序都要通過字符串連接來創建呈現給用戶的HTML 格式的數據。本文對幾種創建此HTML 數據流的方法進行了比較,在特定情況下,某些方法在性能方面要優於其他方法。本文假定您已經具備一定的ASP 和Visual Basic 編程方面的知識。
編寫ASP 頁面時,開發人員實際上是創建一個格式化的文本流,通過ASP 提供的Response 對象寫入Web 客戶端。創建此文本流的方法有多種,而您選擇的方法將對Web 應用程序的性能和可縮放性產生很大影響。很多次,在我幫助客戶優化其Web 應用程序的性能時,發現其中一個比較有效的方法是更改HTML 流的創建方式。本文將介紹幾種常用技術,並測試它們對一個簡單的ASP 頁面的性能所產生的影響。
許多ASP 開發人員都遵循良好的軟件工程原則,盡可能地將其代碼模塊化。這種設計通常使用一些包含文件,這些文件中包含對頁面的特定不連續部分進行格式化生成的函數。這些函數的字符串輸出(通常是HTML 表格代碼)可以通過各種組合創建一個完整的頁面。某些開發人員對此方法進行了改進,將這些HTML 函數移到Visual Basic COM 組件中,希望充分利用已編譯的代碼提供的額外性能。
儘管這種設計方法很不錯,但創建組成這些不連續HTML 代碼組件的字符串所使用的方法將對Web 站點的性能和可縮放性產生很大的影響,無論實際的操作是在ASP 包含文件中執行還是在Visual Basic COM 組件中執行。
請看以下WriteHTML 函數的代碼片斷。名為Data 的參數只是一個字符串數組,其中包含一些要格式化為表格結構的數據(例如,從數據庫返回的數據)。
Function WriteHTML( Data )Dim nRepFor nRep = 0 to 99 sHTML = sHTML & vbcrlf _ & "<TR><TD>" & (nRep + 1) & "</TD><TD>" _ & Data( 0, nRep ) & "</TD><TD>" _ & Data( 1, nRep ) & "</TD><TD>" _ & Data( 2, nRep ) & "</TD><TD>" _ & Data( 3, nRep ) & "</TD><TD>" _ & Data( 4, nRep ) & "</TD><TD>" _ & Data( 5, nRep ) & "</TD></TR>"NextWriteHTML = sHTMLEnd Function
這是很多ASP 和Visual Basic 開發人員創建HTML 代碼時常用的方法。 sHTML 變量中包含的文本返回到調用代碼,然後使用Response.Write 寫入客戶端。當然,這還可以表示為直接嵌入不包含WriteHTML 函數的頁面的類似代碼。此代碼的問題是,ASP 和Visual Basic 使用的字符串數據類型(BSTR 或Basic 字符串)實際上無法更改長度。這意味著每當字符串長度更改時,內存中字符串的原始表示形式都將遭到破壞,而且將創建一個包含新字符串數據的新的表示形式:這將增加分配內存和解除分配內存的操作。當然,ASP 和Visual Basic 已為您解決了這一問題,因此實際開銷不會立即顯現出來。分配內存和解除分配內存要求基本運行時代碼解除各個專用鎖定,因此需要大量開銷。當字符串變得很大並且有大塊內存要被快速連續地分配和解除分配時,此問題變得尤為明顯,就像在大型字符串連接期間出現的情況一樣。儘管這一問題對單用戶環境的影響不大,但在服務器環境(例如,在Web 服務器上運行的ASP 應用程序)中,它將導致嚴重的性能和可縮放性問題。