效能|最佳化|中文 最大限度最佳化你的Asp效能
ASP 能快速執行你的動態網頁,但你還可以通過緊縮代碼和資料庫連接以使它們執行更快。這是一
篇關於怎樣精簡代碼和Asp 特徵以獲得最快執行速度的詳細文章。對於一個急燥的使用者來說,任何在按
下使用者按鈕到結果出現在它們的螢幕之間的延遲可能意味著它們會轉到瀏覽其它的網站?假如你的是商
業網站,這有可能意味著失去潛在的銷售。
我們沒有任何辦法控制使用者的頻寬,但我們的確能通過最佳化Asp 網站來獲得最佳的效能。大部分潛
在效能的提升是通過系統改變而不是緊縮代碼,一個不合適的想法是,一旦遇到系統效率問題,就向系
統管理者提意見要其升級系統。
首先,哪個因素可能影響Asp的效能?很不幸,有很多因素?下面這些只是其中的一部分:
可用頻寬
伺服器上的處理器和其它硬體的速度
在伺服器上啟動並執行其它程式(比如象那些OpenGL螢幕保護裝置程式!)
資料庫連接模式,串連池,資料庫系統本身(比如Oracle優於Sql Server,Sql server優於Access)
所使用的語言
預存程序優於行式Sql語句
使用編譯組件而不是VB或JavaScript,好的Asp編程經驗,比如錯誤處理等
一些以上的因素可能已經被有IIS 知識經驗的開發人員普遍留意到了,但其它的可能對於他們來說是
十分複雜的問題。在這篇文章裡, 將試著解釋所有影響Asp效能的每個因素,讓我們看一看那些在我們
刮鬍子的幾毫秒內就能做到的主要事情。
ASP指令碼大小
你是指令碼頁(還有其它頁面)是不是比必須的長度要長?這是一開始執行就會降低Asp 效能的東西。
ASP 指令碼在用來擷取資訊和格式化輸出的時候是十分有用的,但指令碼也是逐行解釋執行,所以你的指令碼
越長,執行它的時間也就越長。
如果你的指令碼很龐大,怎麼做才能減少指令碼的長度呢?這裡有幾點建議:
你可以將它們轉換成伺服器端組件,也就是說,做成VB動態連結程式庫DLL或者通過先進的Windows編程
語言或適當的COM 介面語言將它轉換成未編譯組件?並且在伺服器端註冊它們。有關的快速指南可以在
http://www.webdevelopersjournal.com/articles/activex_for_asp.html找到。對一個寫得好的Activ
eX 組件進行編譯不但能大幅度提高效能,還可以保護你的軟體(指令碼),尤其當你將你的Asp網站發布在
第三方主機上的時候。
因為指令碼是逐行解釋執行的,所以剔除多餘的指令碼或建立更高效率的指令碼能夠改進效能。如果你在
單個Asp 檔案中有數百行的代碼,可能這樣做你能很好地劃分使用者,買賣和資料服務。事實上,如果
你這樣做,可能會找出一些冗餘的代碼:如果你需要輸出幾個表格,你可以編寫一個通用函數來輸出一
個表格,只是多次調用它。
在講述Asp 指令碼的大小問題的時候,不得不提及包含檔案的大小。當你使用一個包含檔案的時候,
整個包含檔案被裝入,當包含檔案被包含的時候,相當於在Asp 檔案本身寫下那部分代碼。因此,如果
你在一個冗長的包含檔案裡定義了很多通用的方法和定義,要明白到在你包含該檔案的時候,不管你要
不要用到裡面的每個方法和定義,它都是被整個裝入的。ASP 緩衝全部的展開代碼,這會降低尋找效率
在這種情況下,包含檔案必須被分割成更小的,模組化的檔案。也要明白到包含檔案被伺服器視為單獨
的頁面請求,使用太多的包含檔案會影響下載時間。
<!-- #include file="Header.asp" -->
<!-- #include file="Footer.asp" -->
<SCRIPT language="vbscript" runat="server">
Sub Main()
WriteHeader
WriteBody
WriteFooter
End Sub
Sub WriteBody()
...
End Sub
Main '調用過程Main
</SCRIPT>
假如你的指令碼冗長的話,請使用Response.IsClientConnected。這意味著在用戶端不再串連到服務
器的時候,你的伺服器CPU能避免迴圈等待。
<%
'檢查用戶端是否仍在串連
If Not Response.IsClientConnected Then
'仍然串連著,處理常式
Else
'斷開
End If
%>
Interspersing ASP and HTML
每個人都這樣做?當我們輸出表格的時候,我們會在ASP 和HTML代碼間轉換,而這是一個不好的習
慣。例如:
<HTML>
<BODY>
<%
Set MyConn = Server.CreateObject("ADODB.Connection")
MdbFilePath = Server.MapPath("sample.mdb")
MyConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MdbFilePath & ";"
SQL_query = "SELECT * FROM Friends"
Set RS = MyConn.Execute(SQL_query)
WHILE NOT RS.EOF
%>
<LI><%=RS("Name")%>: <A HREF="">Homepage</A>
<%
RS.MoveNext
WEND
%>
</BODY>
</HTML>
另一個普遍的例子是使用IF語句的時候:
<%
If Not Session("DBOpen") Then
%>
<H1>D