二十八條改善 ASP 效能和外觀的技巧(15-21)

來源:互聯網
上載者:User
技巧|效能 技巧 15:批處理內嵌指令碼和 Response.Write 語句
技巧 16:如果頁面需要很長時間才能完成,那麼執行前使用 Response.IsClientConnected
技巧 17:使用 <OBJECT> 標記例示對象
技巧 18:對於 ADO 和其它組件使用 TypeLib 綁定
技巧 19:利用瀏覽器的驗證功能
技巧 20:避免在迴圈語句中使用字串串聯
技巧 21:啟用瀏覽器和代理緩衝
技巧 15:批處理內嵌指令碼和 Response.Write 語句
VBScript 文法 <% = expression %> 將“expression”的值寫到 ASP 輸出資料流中。如果響應緩衝未啟用,那麼執行其中的每一條語句,都會以許多小的資料包通過網路將資料寫到瀏覽器中。這樣速度很慢。而且穿插執行少量的指令碼和 HTML,將引起指令碼引擎和 HTML 之間的切換,從而降低效能。因此,使用下面的技巧:使用 Response.Write 調用代替捆綁緊密的內嵌運算式。例如,在下面的樣本中,在每一行的每一欄位對響應流有一次寫操作,每一行在 VBScript 和 HTML 之間有許多切換:

<table>
<% For Each fld in rs.Fields %>
<th><% = fld.Name %></th>
<%
Next
While Not rs.EOF
%>
<tr>
<% For Each fld in rs.Fields %>
<td><% = fld.Value %></td>
<% Next
</tr>
<% rs.MoveNext
Wend %>
</table>


下面的代碼更有效,每一行對響應流有一次寫操作。所有的代碼都包含在一個 VBScript 塊內:

<table>
<%
For each fld in rs.Fields
Response.Write (?<th>? & fld.Name & ?</th>? & vbCrLf)
Next
While Not rs.EOF
Response.Write (?<tr>?)
For Each fld in rs.Fields %>
Response.Write(?<td>? & fld.Value & ?</td>? & vbCrLf)
Next
Response.Write ?</tr>?
Wend
%>
</table>


當禁用響應緩衝時,這一技巧的效果特別大。最好啟用響應緩衝,然後看批處理 Response.Write 是否有助於提高效能。

(在這一特定舉例中,建立表主體的嵌套迴圈 (While Not rs.EOF...) 可以用仔細構建的 GetString 調用來替代。)

技巧 16:如果頁面需要很長時間才能完成,那麼執行前使用 Response.IsClientConnected
如果使用者性急,他們可能會在您開始執行他們的請求之前,就會放棄 ASP 頁面。如果他們單擊重新整理或移到伺服器上的另一個頁面,在 ASP 請求隊列的末尾就有一個新的請求等候,在隊列的中間有一個中斷連線的請求。當伺服器的負載很高時(因此請求隊列就會很長,回應時間也會相應地變長),就會經常發生這種情況,這樣只能使情況變得更糟。如果使用者不再串連,執行 ASP 頁面(特別是慢的、大的 ASP 頁面)已沒有任何意義。您可以使用 Response.IsClientConnected 屬性檢查這一情況。如果它返回 False,則應調用 Response.End 並放棄頁的其餘部分。事實上,IIS 5.0 已將這一做法編為程式 - 每當 ASP 即將執行新請求時,它就會檢查請求在隊列中已等候了多長時間。如果已經在那裡等候了多於 3 秒鐘,ASP 將檢查客戶機是否仍處於串連狀態,如果沒有串連,就立即終止請求。您可以在設定資料庫中使用 AspQueueConnectionTestTime 設定將逾時時間由 3 秒調整為其它值。

如果頁面要花很長時間才能執行完,也可以不時地檢查 Response.IsClientConnected。當啟用了響應緩衝時,最好不時地執行 Response.Flush,以使用者知道,正在發生什麼事。

注意 在 IIS 4.0 上,除非先執行了 Response.Write,否則 Response.IsClientConnected 就不能正常工作。如果啟用了緩衝,您也必須執行 Response.Flush。在 IIS 5.0 上,卻沒有必要這樣做,- Response.IsClientConnected 工作正常。在任何情況下,Response.IsClientConnected 都會有一些開銷,因此只有在一個操作至少要花(比方說) 500 毫秒(如果您想維持每秒鐘數十頁的輸送量,這是一個很長的時間)才使用它。經驗表明,不要每次重複執行緊密迴圈時都調用它,如顯示表的許多行時 - 每隔二十或五十行調用一次可能比較合適。

技巧 17:使用 <OBJECT> 標記例示對象
如果要引用不在所有代碼路徑(特別是伺服器或Application 領域的對象)中使用的對象,使用 Global.asa 中 <object runat=server id=objname> 標記聲明它們,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即建立對象。如果以後不再使用該對象,您就浪費了資源。<object id=objname> 標記聲明 objname,但在其方法或屬性第一次使用以前,不會建立 objname。

這又是一個惰性計算的例子。

技巧 18:對於 ADO 和其它組件使用 TypeLib 聲明
當使用 ADO 時,開發人員經常加入 adovbs.txt,以訪問 ADO 的各種常量。在要使用常量的每個頁面中必須包含此檔案。此常量檔案相當大,給每個 ASP 頁面的編譯時間和指令碼大小增加了許多系統開銷。

IIS 5.0 引入了綁定到組件類型庫的功能。這可使您參考型別庫一次,並將其用在每個 ASP 頁面上。每個頁面不會產生編譯常量檔案的開銷,且組件開發人員不必建立 VBScript#_include 檔案以在 ASP 上使用。

要訪問 ADO TypeLib,將下面一條語句放在 Global.asa 中。

<!-- METADATA NAME=?Microsoft ActiveX Data Objects 2.5 Library?
TYPE=?TypeLib? UUID=?{00000205-0000-0010-8000-00AA006D2EA4}? -->




<!-- METADATA TYPE=?TypeLib?
FILE=?C:\Program Files\Common Files\system\ado\msado15.dll? -->


技巧 19: 利用瀏覽器的驗證功能
現今的瀏覽器對一些進階功能如 XML、DHTML、Java Applet和遠端資料服務提供支援。儘可能使用這些功能。所有這些技術都可以執行客戶機端驗證和資料緩衝,免去了到 Web 服務器的往返。如果您在運行一個智能瀏覽器,那麼瀏覽器就能為您進行一些驗證(例如,在執行 POST 之前,檢查信用卡校正和是否有效)。儘可能使用這一功能。通過減少客戶-伺服器之間的往返,可降低 Web 服務器上的負載,並能減少網路通訊量(雖然發送到瀏覽器的第一個頁面可能比較大)以及伺服器訪問的任何後端資源。此外,使用者不必像住常一樣讀取新頁,從而使用者的感覺會好一些。這樣做並不意味著您可以不進行伺服器端驗證 - 您還應始終進行伺服器端驗證。這可以防止由於某種原因(如駭客,或瀏覽器不運行客戶機端驗證常式)客戶機產生錯誤的資料。

人們已經進行了大量的工作,開發“獨立於瀏覽器”的 HTML。正是由於這種憂慮,開發人員不願再使用流行的瀏覽器功能,但這些功能本可以改善效能。對於一些真正的高效能網站,必須關心瀏覽器“訪問”問題,一個好的策略是最佳化頁面,使其適應流行的瀏覽器。使用瀏覽器功能組件,可以在 ASP 中方便地檢測到瀏覽器功能。Microsoft FrontPage 等工具有助於設計適合於瀏覽器和指定 HTML 版本的代碼。參見 When is Better Worse?Weighing the Technology Trade-Offs,以瞭解更進一步的討論。

技巧 20:避免在迴圈語句中使用字串串聯
許多人在迴圈語句中建立一個字串,如下所示:

s = ?<table>? & vbCrLf
For Each fld in rs.Fields
s = s & ? <th>? & fld.Name & ?</th> ?
Next

While Not rs.EOF
s = s & vbCrLf & ? <tr>?
For Each fld in rs.Fields
s = s & ? <td>? & fld.Value & ?</td> ?
Next
s = s & ? </tr>?
rs.MoveNext
Wend

s = s & vbCrLf & ?</table>? & vbCrLf
Response.Write s


採用這種方法會出現一些問題。第一個問題是反覆串聯字串需要花兩次方的時間,更通俗地說



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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