大多數 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 應用程序)中,它將導致嚴重的性能和可縮放性問題。
新聞熱點
疑難解答