改善ASP效能和外觀的技巧集錦(轉自電腦世界)(二)

來源:互聯網
上載者:User
技巧|效能 技巧 7: 將代碼封裝在 COM 物件中
如果您有許多 VBScript 或 JScript,您可以經常將代碼移到編譯的 COM 物件中,從而可改善效能。編譯的代碼通常比解釋的代碼運行得更快。編譯的 COM 物件可以通過“早綁定”訪問其它 COM 物件,與指令碼使用的“晚綁定”相比,“早綁定”是調用 COM 物件的更有效方法。將代碼封裝在 COM 物件中還有一些優點(除效能之外):
COM 物件有利於將表示邏輯與商務邏輯分開。
COM 物件可以保證代碼重複使用。
許多開發人員發現以 VB、C++ 或 Visual J++ 編寫的代碼比 ASP 更容易調試。
COM 物件也有缺點,包括初始開發時間和需要不同的程式設計技巧。注意封裝少量的 ASP 可能引起效能下降,而不會得到效能改進。這種情況通常在少量的 ASP 代碼被封裝進 COM 物件時發生。在這種情況下,建立和調用 COM 物件的系統開銷超過了編譯的代碼的優點。應反覆地實驗,以確定什麼樣的 ASP 指令碼和 COM 物件代碼的組合產生最好的效能。注意,與 Microsoft Windows NT® 4.0/IIS 4.0 相比,Windows 2000/IIS 5.0 中在指令碼和 ADO 效能方面有了很大的改進。因此,隨著 IIS 5.0 的推出,編譯代碼比 ASP 代碼的效能優勢有所降低。如果您部署 COM 組件,以負荷對它們進行測試特別重要。事實上,理所當然應對所有的 ASP 應用程式進行負荷測試。
技巧 8:遲一點獲得資源,早一點釋放資源
這裡是一個小技巧供您參考。一般來說,最好遲一點獲得資源,早一點釋放資源。這適用於 COM 物件以及檔案控制代碼和其它資源。這種最佳化方法主要用於 ADO 連線和記錄集。當您使用完記錄集,比方說在顯示一個表及其資料之後,應立即釋放它,而不是等到頁面結束時再釋放。將 VBScript 變數設定為Nothing 是最好的做法。不要讓記錄集超出範圍之外。而且,要釋放任何相關的 Command 或 Connection 對象(在將記錄集或串連設定為 = Nothing 之前,不要忘記調用Close())。這會縮短資料庫必須為您準備資源的時間,並儘快釋放資料庫到串連池的串連。
技巧 9:進程外執行過程以效能換取可靠性
ASP 和 MTS/COM+ 兩者都有配置選項,可使您兼顧可靠性和效能。當建立和部署應用程式時,應知道如何兼顧兩者的效能。ASP 選項可以配置 ASP 應用程式,以便以三種方法之一運行。在 IIS 5.0 中,引入了“隔離級”這一術語以說明這些選項。這三個隔離級分別是低級、中級和進階:
低級隔離:這在 IIS 的所有版本中都得到支援,且是最快的。它在 Inetinfo.exe 中運行 ASP,Inetinfo.exe 是主要 IIS 進程。如果 ASP 應用程式崩潰,IIS 也會崩潰。(要在 IIS 4.0 下重新啟動 IIS,Web 網站管理員應使用諸如 InetMon 之類的工具監視網站,如果伺服器發生故障,應啟用批次檔以重新啟動伺服器。IIS 5.0 引入了可靠的重新啟動,該方法可使發生故障的伺服器自動重新啟動。)
中級隔離:IIS 5.0 引入了這個新的層級,它被稱為進程外層級,因為 ASP 在 IIS 進程之外運行。在中級隔離中,被配置作為中級隔離啟動並執行所有 ASP 應用程式都共用一個進程空間。這就減少了在一台伺服器運行多個進程外 ASP 應用程式所需要的進程數量。中級隔離是 IIS 5.0 中的預設隔離等級。
進階隔離:在 IIS 4.0 和 IIS 5.0 中支援這一層級,進階隔離也是進程外的。如果 ASP 崩潰,Web 服務器並不會崩潰。下次 ASP 請求時,ASP 應用程式就會自動重新啟動。在進階隔離中,配置作為進階隔離啟動並執行每個 ASP 應用程式都在其自有進程空間中運行。這樣做可保護 ASP 應用程式彼此之間不相互幹擾。其缺點是它要求每個 ASP 應用程式都要有一個單獨的進程。當在一台伺服器上必須運行許多應用程式時,系統開銷就會大大增加。
哪個選項最好的呢?在 IIS 4.0 中,進程外運行將顯著降低效能。在 IIS 5.0 中,做了許多改進,將進程外運行 ASP 應用程式所產生的開銷降到最低限度。事實上,在絕大多數測試中,IIS 5.0 中的 ASP 進程外應用程式比 IIS 4.0 中的進程內應用程式運行得更快。不管怎樣,在兩個平台上,進程內(低隔離級)效能最佳。但是,如果訪問率相對較低或最大輸送量較低,低隔離級的優勢不太明顯。因此,在您每一 Web 服務器每秒鐘需要數百或成千上萬頁面時,才會覺得有必要設定低隔離級。與往常一樣,應對多種配置進行測試,確定您要採取哪一種折衷方案。
注意 當您運行 ASP 進程外應用程式時(中級或進階隔離),它們在 NT4 中的 MTS 和在 Windows 2000 中的 COM+ 中運行。即,在 NT4 中它們在 Mtx.exe 中運行;而在 Windows 2000 中,它們在 DllHost.exe 中運行。您可以在工作管理員中看到這些進程在運行。您還可以看到 IIS 如何為進程外 ASP 應用程式配置 MTS 程式包或 COM+ 應用程運行。您還可以看到 IIS 如何為進程外 ASP 應用程式配置 MTS 程式包或 COM+ 應用程式。
COM 選項
COM 組件也有三種配置選項,雖然與 ASP 選項不完全類似。COM 組件可以是“未配置的”、配置為庫應用程式或配置為伺服器應用程式。“未配置的”意思是指組件沒有註冊COM+。組件將在調用程式的進程空間運行,那就是說,它們是“進程內的”。庫應用程式也是進程內的,但使用 COM+ 的服務,包括安全、事務和上下文支援。伺服器應用程式被配置為在它們自有的進程空間內運行。
您可以看到未配置的組件比庫應用程式略有一些優勢。庫應用程式比伺服器應用程式的效能優點更大。這是因為庫應用程式與 ASP 在同一進程內運行,而伺服器應用程式在它們的自有進程內運行。進程間的調用比進程內調用開銷更大。而且,當在進程之間傳遞諸如記錄集之類的資料時,必須在兩個進程之間複製所有的資料。
陷阱!當使用 COM 伺服器應用程式時,如果您在 ASP 和 COM 之間傳遞對象,要確保對象執行“按值彙集”或 MBV。執行 MBV 的對象將它們自己從一個進程複製到另一個進程。這比下面一種方法好,採用這種方法時,對象仍在建立者的進程中,另外一個進程反覆地調用建立進程以使用該對象。切斷串連的 ADO 記錄集將“按值彙集”,串連的記錄集則不然。Scripting.Dictionary 不執行 MBV,且不在進程之間傳遞。
最後,VB 程式員請注意:MBV 不通過傳遞參數 ByVal 獲得。MBV 由原始的組件作者執行。怎麼辦?
如果讓我們建議一個兼顧效能與可靠性的合理配置,它們應是如下的配置:
在 IIS 4.0 中,使用 ASP 低隔離等級,使用 MTS 伺服器程式包。
在 IIS 5.0 上,使用 ASP 的中隔離級,並使用 COM+ 庫應用程式。
這些是非常一般的原則,主機服務公司一般情況下以中或高隔離級運行 ASP,而單用途的 Web 服務器可以以低隔離級運行。衡量各種利弊,並自己決定哪個配置更能符合您的需要。
技巧 10:使用顯式選項
在 .asp 檔案中應使用 Option Explicit。此指令放在 .asp 檔案的最上面,它強制開發人員聲明要使用到的所有變數。許多程式員認為這種方法對於調試應用程式很有協助,因為這種方法避免了鍵錯變數名和誤建新變數的可能性(例如,將 MyXMLString=) 錯寫成 MyXLMString=...。
更重要的一點也許是,聲明的變數比未聲明的變數速度更快。由此,指令碼在運行時每次用到未聲明的變數時,按名稱引用它。另一方面,聲明的變數是有順序的,要麼以編譯時間,要麼以已耗用時間。以後,聲明的變數都按此順序引用。因為 Option Explicit 強制變數聲明,它能確保聲明所有變數,因此訪問的速度也很快。
技巧 11:在子常式和函數中使用局部變數
局部變數是那些在子常式和函數內聲明的變數。在函數或子常式內,局部變數訪問比全域變數訪問更快。局部變數的使用也會使代碼更清晰,因此應盡量使用局部變數。
技巧 12:將經常使用的資料複製到指令碼變數中
當訪問 ASP 中的 COM 物件時,應將經常使用的對象資料複製到指令碼變數中。這樣做可減少 COM 方法調用,因為 COM 方法調用與訪問指令碼變數相比,開銷相對較大。當訪問Collection 和 Dictionary 對象時,這種技術也會減少開銷很大的尋找。
一般來說,如果您打算不止一次訪問對象資料,那麼就應將資料放到指令碼變數中。這種最佳化的主要目標是 Request 變數(Form 和 QueryString 變數)。例如,您的網站可傳遞一個名為 UserID 的 QueryString 變數。假設此 UserID 在特定頁面上被引用 12 次。可以無須調用 Request(?UserID?) 12 次,而是在 ASP 頁面最上面將 UserID 指派到。可以無須調用 Request(?UserID?) 12 次,而是在 ASP 頁面最上面將 UserID 指派到一個變數。然後在該頁面自始至終使用該變數。這樣就省去了 11 次 COM 方法調用。實際上,訪問 COM 屬性或方法的開銷並沒有那麼大。
技巧 13:避免重新確定數組的維數
應盡量避免 Redim 數組。就效能而言,如果電腦的實體記憶體大小有限,最好將數組的初始維數設定為其最不利的情況 - 或將維數設定為其最佳的情況,然後再按需要重新確定維數。這並非意味著,如果知道您不需要記憶體時,就隨便分配幾MB的記憶體。
下面的代碼給您顯示使用 Dim 和 Redim 不當的情形。
<%
Dim MyArray()
Redim MyArray(2)
MyArray(0) = ?hello?
MyArray(1) = ?good-bye?
MyArray(2) = ?farewell?
...
' some other code where you end up needing more space happens, then ...
Redim Preserve MyArray(5)
MyArray(3) = ?more stuff?
MyArray(4) = ?even more stuff?
MyArray(5) = ?yet more stuff?
MyArray(5) = ?yet more stuff?
%>
最好一開始就將數組的初始大小 Dim 正確(在本例中,是 5)比 Redim 數組使其更大好得多。您可能浪費一些記憶體(如果您沒有使用所有的元素),但獲得的好處是速度變得更快。
技巧 14:使用響應緩衝
您可以通過啟用“響應緩衝”,將要輸出的一整頁緩衝起來。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.