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

微軟建議的ASP性能優化28條守則

2013-11-13 10:00:48  來源: .NET編程 

  引言
  
  性能是一個特征您必須預先設計性能否則您以後就得重寫應用程序就是說有哪些好的策略可使 Active Server Pages (ASP) 應用程序性能達到最佳?
  
  本文介紹了優化 ASP 應用程序和 Visual Basic® Scripting Edition (VBScript) 的技巧本文討論了許多陷阱本文列出的建議已經在 和其它站點中進行了測試效果十分顯著本文假定您已經對 ASP 開發包括 VBScript 和/或 JScriptASP ApplicationASP Session 和其它 ASP 固有對象(RequestResponse 和 Server)有了基本了解
  
  通常ASP 性能主要取決於 ASP 代碼本身以外的很多因素我們不在一篇文章中羅列出所有的信息在本文結尾處我們列出了與性能有關的資源這些鏈接涵蓋了 ASP 和非 ASP 主題包括 ActiveX® 數據對象 (ADO)組件對象模型 (COM)數據庫和 Internet Information Server (IIS) 配置這些都是我們喜歡的一些鏈接 一定要去看看
  
  技巧 將經常使用的數據緩存在 Web 服務器上
  
  典型的 ASP 頁從後端數據存儲中檢索數據然後將結果轉換成超文本標記語言 (HTML)無論數據庫的速度如何從內存中檢索數據總要比從後端數據存儲中檢索數據快得多從本地硬盤讀取數據通常也比從數據庫中檢索數據更快因此通常可以將數據緩存在 Web 服務器上(存儲在內存或磁盤中)來提高性能
  
  緩存是傳統的以空間換取時間的做法如果您緩存的內容正確那麼您可以看到性能會有顯著的提高為使緩存有效必須保存那些經常重復使用的數據且要重新計算這些數據需要(適度)大的開銷如果緩存的都是些陳舊的數據就會造成內存浪費
  
  不經常發生改變的數據是很好的緩存候選數據因為您不必擔心隨著時間的遷移該數據與數據庫同步的問題組合框列表引用表DHTML 碎片擴展標記語言 (XML) 字符串菜單項和站點配置變量(包括數據源名稱 (DSN)Internet 協議 (IP) 地址和 Web 路徑)都是很好的緩存候選內容注意您可以緩存數據的表示而不緩存數據本身如果 ASP 頁很少更改且緩存的開銷也很大(例如整個產品目錄)則應考慮事先產生 HTML而不是在響應每個請求時重新顯示
  
  應將數據緩存在哪裡有哪些緩存策略?通常數據緩存在 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 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 )可加快速度且更容易一些其詳細情況已超出本文所討論的范圍但下面給出了一個函數舉例說明使用 GetRows() 返回記錄集數據的一個數組
  
   Get Recordset return as an Array
  Function FetchEmploymentStatusList
  Dim rs
  Set rs = CreateObject(?ADODBRecordset?)
  rsOpen ?select StatusName StatusID from EmployeeStatus? _
  ?dsn=employees;uid=sa;pwd=;?
  FetchEmploymentStatusList = rsGetRows() ? Return data as an Array
  rsClose
  Set rs = Nothing
  End Function
  
  對上面舉例做更進一步改進可以將 HTML 緩存為列表而不是數組下面是簡單的示例
  
   Get Recordset return as HTML Option list
  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 Field Binding
  Do Until rsEOF
   Next line violates Dont Do String Concats
   but its OK because we are building a cache
  s = s & ? <option>? & fldName & ?</option>? & vbCrLf
  rsMoveNext
  Loop
  s = s & ?</select>? & vbCrLf
  rsClose
  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 = Refresh interval in seconds
  
   Function to return the employment status list
  Function GetEmploymentStatusList
  UpdateEmploymentStatus
  GetEmploymentStatusList = Application(?EmploymentStatusList?)
  End Function
  
   Periodically update the cached data
  Sub UpdateEmploymentStatusList
  Dim d strLastUpdate
  strLastUpdate = Application(?LastUpdate?)
  If (strLastUpdate = ??) Or _
  (UPDATE_INTERVAL < DateDiff(?s? strLastUpdate Now)) Then
  
   Note: two or more calls might get in here This is okay and will simply
   result in a few unnecessary fetches (there is a workaround for this)
  
   FetchEmploymentStatusList function (not shown)
   fetches data from DB returns an Array
  d = FetchEmploymentStatusList()
  
   Update the Application object Use ApplicationLock()
   to ensure consistent data
  ApplicationLock
  Application(?EmploymentStatusList?) = Events
  Application(?LastUpdate?) = CStr(Now)
  ApplicationUnlock
  End If
  End Sub
  
  請參見 Worlds Fastest ListBox with Application Data上面還有一個例子
  
  要知道在 Session 或 Application 對象中緩存大的數組不是一個好的做法在訪問數組的任何元素之前腳本語言的語法要求必須臨時復制整個數組例如如果將由字符串組成的有 個元素的數組(該數組將美國郵政編碼映射到當地的氣象站)緩存在 Application 對象中ASP 必須先將所有的 個氣象站復制到臨時數組中然後才能提取一個字符串在這種情況下用自定義方法建立一個自定義組件來存儲氣象站 或使用一個詞典組件會更好
  
  再警告大家一下不要將嬰兒與洗澡水一起倒掉數組能快速查尋和存儲在內存中是鄰近的關鍵數據對索引一個詞典比索引一個數組要慢得多應針對您的實際情況選擇提供最佳性能的數據結構
  
  技巧 將數據和 HTML 緩存在 Web 服務器的磁盤上
  
  有時數據可能太多無法都緩存在內存中太多只是一個說法這要看您想消耗多少內存以及需緩存的項目數和檢索這些項目的頻率在任何情況下如果數據太多而無法都緩存在內存中則考慮
From:http://tw.wingwit.com/Article/program/net/201311/12287.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.