熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

改進性能和樣式的 24個 ASP 技巧(1)

2013-11-13 09:48:50  來源: .NET編程 

  簡介
  性能是一個特性您需要預先設計性能或是在日後重新編寫應用程序換句話說什麼是最大限度優化 Active Server Pages (ASP) 應用程序性能的好策略?
  
  本文為優化 ASP 應用程序和Visual Basic(R) 腳本編輯器 (VBScript)提供了許多技巧對許多陷阱和缺陷進行了討論本文所列的建議均在 及其他站點上進行了測試而且工作正常本文假定您對 ASP 開發有基本的理解包括對 VBScript 和/或 JScriptASP ApplicationASP Session 和其他 ASP 內部對象(請求響應和服務器)
  
  ASP 的性能通常不止取決於 ASP 代碼本身我們並不想在一篇文章中囊括所有的至理名言只在最後列出與性能相關的資源這些鏈接包括 ASP 和非 ASP 主題包括ActiveX(R) 數據對象 (ADO)部件對象模型 (COM)數據庫和Internet 信息服務器 (IIS)配置這些是我們喜歡的鏈接 務請關注它們
  
  技巧 在 Web 服務器上緩存常用數據
  典型的 ASP 頁從後端數據庫檢索數據然後將結果轉換為超文本標記語言 (HTML)無論數據庫的速度如何從內存檢索數據要比從後端數據庫檢索數據快得多從本地硬盤讀取數據通常也要比從數據庫檢索數據快得多因此通常可以通過在 Web 服務器(在內存或磁盤)上緩存數據來改善性能
  
  緩存是典型的空間與時間的折衷如果恰當地緩存數據您將看到性能會有驚人的提高為使緩存發揮效力它必須保持經常重用的數據而且重新計算這些數據的代價是昂貴的或比較昂貴的如果緩存充滿了垃圾數據則是對存儲器的浪費
  
  不經常變化的數據也是緩存的候選數據因為您無須擔心數據與數據庫的同步問題組合框引用表DHTML 碎片可擴展標記語言 (XML) 字符串菜單項和站點配置變量(包括數據源名稱 (DSN)Internet 協議 (IP) 地址和 Web 路徑)都是緩存的候選數據注意您可以緩存數據的表示而不是數據本身如果 ASP 頁不經常更改而且緩存的成本也非常高(例如整個產品目錄)請考慮預先生成 HTML而不是在每次請求時重新繪制
  
  數據應緩存在何處有哪些緩存策略?數據經常緩存在 Web 服務器內存或 Web 服務器磁盤上下面兩個技巧討論這些選項
  
  技巧 在 Application 或 Session 對象中緩存常用數據
  ASP Application 和 Session 對象為在內存中緩存數據提供了方便的容器既可以將數據賦予 Application 對象也可將數據賦予 Session 對象這些數據在 HTTP 調用中將保留在內存中Session 數據按用戶存儲而 Application 數據在所有用戶間共享
  
  何時將數據載入 Application 或 Session?通常在 Application 或 Session 啟動時加載數據要在 Application 或 Session 啟動時加載數據請在下面兩函數中添加相應的代碼
  Application_OnStart()
  或
  Session_OnStart()
  這兩個函數應該位於 Globalasa如果沒有可以添加這些函數也可以在第一次需要數據時加載數據要進行上述操作請在 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 )會更快更簡便完整而詳細的內容已超出了本文的范圍下面的演示函數使用了
  GetRows()
  來返回記錄集數據的數組
  
   取記錄集以數組返回
  Function FetchEmploymentStatusList
  Dim rs
  Set rs = createObject(ADODBRecordset)
  rsOpen select StatusName StatusID from EmployeeStatus _
  dsn=employees;uid=sa;pwd=;
  FetchEmploymentStatusList = rsGetRows() 以數組返回數據
  rsClose
  Set rs = Nothing
  End Function
  
  對上面示例的進一步改進應當是緩存該列表的 HTML而不是緩存數組下面是一個簡單的范例
  
   取記錄集HTML 選項列表返回
  Function FetchEmploymentStatusList
  Dim rs fldName s
  Set rs = createObject(ADODBRecordset)
  rsOpen select StatusName StatusID from EmployeeStatus _
  dsn=employees;uid=sa;pwd=;
  s = <select name=EmploymentStatus> & vbCrLf
  Set fldName = rsFields(StatusName) ADO 字段綁定
  Do Until rsEOF
   下面一行違背了不要進行字符串連接
   但這是可以的因為我們正在建立高速緩存
  s = s & <option> & fldName & </option> & vbCrLf
  rsMoveNext
  Loop
  s = s & </select> & vbCrLf
  rsClose
  Set rs = Nothing 參見盡早釋放
  FetchEmploymentStatusList = s 以字符串返回數據
  End Function
  
  在正常的情況下可以在 Application 或 Session 作用域中緩存 ADO 記錄集本身有兩個警告
  
  ADO 必須為標記的自由線程
  必須使用斷開連接的記錄集
  如果不能保證滿足這兩個要求請不要緩存 ADO 記錄集在下面的非靈活組件和不要緩存連接技巧中我們將討論在 Application 或 Session 作用域中存儲 COM 對象的危險
  
  如果在 Application 或 Session 作用域中存儲數據這些數據將一直保留在那兒直到在程序中改變它Session 過期或 Web 應用程序重新啟動時為止數據需要更新如何處理?若要用手工強制更新應用程序數據可以調用只允許管理員訪問的數據更新 ASP 頁另外還可以通過函數周期地自動刷新數據下面的示例存儲帶緩存數據的時間戳在指定時間間隔後刷新數據
  
  <%
   未顯示錯誤處理
  Const update_INTERVAL = 刷新時間間隔以秒計
  
   函數返回雇傭狀態列表
  Function GetEmploymentStatusList
  updateEmploymentStatus
  GetEmploymentStatusList = Application(EmploymentStatusList)
  End Function
  
   定期更新緩存的數據
  Sub updateEmploymentStatusList
  Dim d strLastupdate
  strLastupdate = Application(Lastupdate)
  If (strLastupdate = ) Or _
  (update_INTERVAL DateDiff(s strLastupdate Now)) Then
  
   注意此處可能有兩個或多個調用這是可以的只不過
   產生幾個不必要的取指令罷了(就此有一個工作區)
  
   FetchEmploymentStatusList 函數(不顯示)
   從 DB 中取數據返回一個數組
  d = FetchEmploymentStatusList()
  
   更新 Application 對象用 ApplicationLock()
   來確保一致的數據
  ApplicationLock
  Application(EmploymentStatusList) = d
  Application(Lastupdate) = CStr(Now)
  ApplicationUnlock
  End If
  End Sub
  
  其他示例請參閱具有 Application 數據的最快列表框(英文)
  
  請注意在 Session 或 Application 對象中緩存大型數組並非上策在訪問數組元素之前腳本語言的語法要求建立整個數組的臨時副本例如如果在 Application 對象中緩存了將美國郵政編碼映射到本地氣象站的字符串數組該字符串數組有 個元素ASP 在找出一個字符串之前必須將所有 個氣象站復制到臨時數組中在這種情況下建立帶自定義方法的自定義組件來存儲氣象站 或使用一個字典組件也許更好
  
  請不要在倒洗澡水時把孩子一同倒掉對這種觀點的一個新的注解是數組提供了對內存中相鄰關鍵數據對的快速查找和存儲索引字典比索引數組要慢您應該根據具體情況選擇能夠提供最佳性能的數據結構
  
  技巧 在 Web 服務器磁盤上緩存數據和 HTML
  有時數據過多不能在內存中進行緩存過多是一種定性的判斷它取決於打算消耗的內存量還有緩存項的數量和這些項的檢索頻率總之如果有過多的數據要在內存中緩存請考慮以文本或 XML 文件的形式在 Web 服務器的硬盤上緩存數據可以將在磁盤上緩存數據和在內存中緩存數據組合起來為站點建立最優的緩存策略
  
  注意在度量單個 ASP 頁的性能時在磁盤上檢索數據不一定比從數據庫中檢索數據快但是緩存減輕了數據庫和網絡的負荷在高負荷情況下這將明顯提高總體通信量在查詢成本很高時緩存查詢的結果緩存便非常有效例如多表聯合或復雜的存儲過程或緩存大型的結果集按照
From:http://tw.wingwit.com/Article/program/net/201311/11646.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.