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

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

2013-11-13 10:12:40  來源: .NET編程 

  技巧 晚點獲取資源早點釋放資源
  這是個小技巧通常最好晚點獲取資源而要早點釋放資源這些資源包括 COM 對象文件句柄和其他資源
  
  ADO 連接和記錄集是這種優化的首要目標當您使用完記錄集就是說用它的數據打印完一個表格後請立即將它釋放而不是等到頁的末尾將您的 VBScript 變量設置為
  Nothing
  是最好的做法不要讓記錄集簡單地脫離作用域同時應當釋放任何有關的 Command 或 Connection 對象(不要忘了對記錄集或連接調用
  Close()
  在將它們設置為
  = Nothing
  之前)這將縮短數據庫必須為您調整資源的時間跨度並將數據庫連接盡可能快地釋放給連接池
  
  技巧 進程外的執行將犧牲可靠性
  ASP 和 MTS/COM+ 都有允許您以可靠性換取性能的配置選項當建立和部署應用程序時應當理解這種交換
  
  ASP 選項
  
  ASP 應用程序可以配置為以三種方式之一運行在 IIS 中引入了術語隔離級來描述這些選項三個隔離級值分別是低中和高
  
  低級隔離該隔離級在所有版本的 IIS 中受到支持並且是最快的它在主 IIS 進程 Inetinfoexe 中執行 ASP如果 ASP 應用程序崩潰則 IIS 也將崩潰(要在 IIS 下重新啟動 IISWeb 站點管理員需要使用工具如 InetMon來監視站點如果服務器失敗將運行批處理文件來重新啟動服務器而 IIS 則引入了可靠的重新啟動它將自動重新啟動失敗的服務器
  中級隔離IIS 引入了這個新隔離級它稱為進程外的這是因為 ASP 運行在 IIS 進程之外在中級隔離中所有被配置按中級運行的 ASP 應用程序將共享單個進程空間這將減少在一個服務器上運行多個進程外的 ASP 應用程序所需的進程數中級是 IIS 中默認的隔離級
  高級隔離在 IIS 和 IIS 中受到支持高級隔離也是進程外的如果 ASP 崩潰則 Web 服務器並不崩潰ASP 應用程序將在下一個 ASP 請求時自動重新啟動使用高級隔離每個被配置為按高級運行的 ASP 應用程序將在其自己的進程空間中運行這樣可以保護 ASP 應用程序彼此不受干擾它的缺點是它需要為每個 ASP 應用程序建立獨立的進程當需要在一個服務器上主持十多個應用程序時會增加很多開銷
  那麼哪個選項是最好的呢?在 IIS 運行進程外的應用程序會極大地影響性能在 IIS 做了許多工作使得進程外運行 ASP 應用程序對性能產生的影響降到了最低實際上在大多數測試中在 IIS 中的 ASP 進程外應用程序要比 IIS 中的進程內應用程序運行得更快無論如何進程內(低隔離級)在兩種平台上仍然產生了最好的性能但是如果您的命中率相對較低或最大吞吐量較低選擇低隔離級不會有太大的好處所以除非您需要每個 Web 服務器每秒處理數百或數千個頁面否則沒有必要選擇低隔離級同樣應當測試多種配置並判斷哪種情形最適合您
  
  注意 當您進程外運行 ASP 應用程序(中級或高級隔離)時則在 NT 上它們將運行在 MTS 中而在 Windows 上它們將運行在 COM+ 中在 NT 上它們運行在 Mtxexe 中而在 Windows 上它們運行在 DllHostexe 中任務管理器您可以看見這些正在運行的進程還可以看見 IIS 如何為進程外的 ASP 應用程序配置 MTS 程序包或 COM+ 應用程序
  
  COM 選項
  
  COM 組件也有三個配置選項雖然與 ASP 選項不完全相似COM 組件可以被不配置配置為庫應用程序或配置為服務器應用程序不配置是指不向 COM+ 注冊組件組件將運行在調用者的進程空間就是說它們是進程中庫應用程序也是進程中的但受惠於 COM+ 的服務包括安全性事務和環境支持服務器應用程序被配置為在其自己的進程空間中運行
  
  您可能看到不配置的組件比庫應用程序優點稍微多些您還可能看到庫應用程序服務器應用程序有很大的性能優點這是因為庫應用程序與 ASP 運行在同一個進程中服務器應用程序則運行在自己的進程中內部進程調用的開銷要比進程內調用的開銷大得多而且當在進程之間傳遞數據(如記錄集)時必須在兩個進程之間復制所有的數據
  
  缺點!當使用COM 服務器應用程序如果要在 ASP 和 COM 之間傳遞對象請確保對象實現按值匯集即 MBV實現 MBV 的對象將其自身從一個進程復制到另一個進程這比另一種方式好在另一種方式中對象留在創建它的進程中而其他進程則重復調用創建使用該對象的進程被斷開連接的 ADO 記錄集將是按值匯集的已連接的記錄集則不是ScriptingDictionary 並不實現 MBV不會在進程之間傳遞最後要另外告訴 VB 程序員的是MBV 不是通過傳遞參數
  ByVal
  獲得的MBV 是由原始組件創作者實現的
  
  怎麼辦?
  
  如果您想要以性能與可靠性的合理交換來完成您的配置我們的推薦如下
  
  在 IIS 使用 ASP 的低隔離級別並使用MTS 服務器包
  在 IIS 使用 ASP 的中隔離級別並使用COM+ 庫應用程序
  這些是很一般的准則通常讓公司以中或高隔離級別運行 ASP而單一目的的 Web 服務器可運行於低隔離級別請權衡折中並自行決定滿足需求的配置
  
  技巧 顯式使用選項
  在 asp 文件中顯式使用
  選項 Explicit
  置於 asp 文件開頭的這一指令強制開發人員聲明所有要使用的變量許多開發人員認為這有助於調試應用程序因為它避免了錯誤鍵入變量名稱而不經意地新建變量(例如
  MyXLMString=
  而非
  MyXMLString=)
  
  
  也許更重要的是聲明的變量比未聲明的變量快實際上腳本運行時在每次使用未聲明變量時按照名稱引用而聲明的變量在編譯或運行時分配了序號這樣聲明的變量按照該序號引用由於
  選項 Explicit
  強制變量聲明因此保證聲明了所有變量而實現快速訪問
  
  技巧 在子例程和函數中使用局部變量
  局部變量是在子例程和函數中聲明的變量在子例程和函數中局部變量訪問要快於全局變量訪問使用局部變量還可以使代碼更加清晰因此盡可能使用局部變量
  
  技巧 將常用數據復制到腳本變量
  在 ASP 中訪問 COM 時應該將常用的對象數據復制到腳本變量中這將削減 COM 方法的調用COM 方法的調用與訪問腳本變量相比要相對昂貴些在訪問 Collection 和 Dictionary 對象時這一技術也可以削減了昂貴的查找
  
  通常如果打算多次訪問對象數據請將數據放入腳本變量該優化的主要目標是 Request 變量(Form 和 QueryString 變量)例如您的站點可能傳遞一個名為 UserID 的 QueryString假定該 UserID 變量要在特定頁中引用 請不要調用
  Request(UserID)
  而在 ASP 頁的開頭將 UserID 賦予某個變量然後就在頁中使用該變量這將節省 次 COM 方法調用
  
  在實際中訪問 COM 屬性或方法暗藏著繁復的過程和大量的開銷下面是一個示例它只是些相當普通的代碼(從語法上講)
  
  Foobarblahbaz = Foobarblahqaz()
  If Foobarblahzaq = Foobarblahabc Then
  
  在運行這段代碼時將發生下列事件
  
  變量
  Foo
  被解析為全局變量
  變量
  bar
  被解析為
  Foo
  的成員這將產生 COM 方法調用
  變量
  blah
  被解析為
  Foobar
  的成員這也將產生 COM 方法調用
  變量
  qaz
  被解析為
  foobarblah
  的成員是的這也將產生 COM 方法調用
  調用
  Foobarblahquaz()
  又一次產生 COM 方法調用理解這幅圖了嗎?
  執行步驟 將再次解析
  baz
  系統不知道調用
  qaz
  是否更改對象模型因此步驟 必須再次執行解析
  baz
  
  將
  baz
  解析為
  Foobarblah
  的成員進行屬性置入
  再次執行步驟 並解析
  zaq
  
  再次執行步驟 並解析
  abc
  
  正如所見這是非常可怕的低效率(而且非常慢)用 VBScript 編寫該代碼實現的快速方法為
  
  Set myobj = Foobarblah 對 blah 做一次解析
  Myobjbaz = myobjqaz()
  If Myobjzaq = Myobjabc Then
  
  如果您使用的是 VBScript 或更高版本則可用
  With
  語句來寫這段代碼
  
  With Foobarblah
  baz = qaz()
  If zaq = abc Then
  
  End With
  
  請注意該技巧對 VB 編程同樣有效
  
  技巧 避免重新定義數組
  盡量避免
  Redim
  數組從關心性能的角度來說如果計算機受物理內存的限制最好一開始將數組的維數設置為最差方案 而不要將維數設置為最佳方案再根據需要重新定義維數這並不意味著明知道不需要那麼多而就是應該分配太多的內存
  
  下面代碼展示了您沒有必要地使用了
  Dim
  和
  Redim
  來解決
  
  <%
  Dim MyArray()
  Redim MyArray()
  MyArray() = hello
  MyArray() = goodbye

From:http://tw.wingwit.com/Article/program/net/201311/12917.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.