技巧|效能
技巧 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
採用這種方法會出現一些問題。第一個問題是反覆串聯字串需要花兩次方的時間,更通俗地說,運行這種迴圈語句所花的時間與記錄數乘以欄位數所得值的平方成正比。舉一個更簡單的例子,就可以更清楚地說明這一問題。
s = ??
For i = Asc(?A?) to Asc(?Z?)
s = s & Chr(i)
Next
在第一次迭代中,您獲得了一個字元的字串 ?A?。在第二次迭代中,VBScript 必須重新分配字串並將兩個字元 (?AB?) 複製到 s 中。在第三次迭代中,它還必須再次重新分配 s 並將三個字元複製到 s 中。在
N 次(第 26 次)迭代中,它必須重新分配並將
N 個字元複製到 s 中。總共就是 1+2+3+...+
N,即
N*(
N+1)/2 次複製。
在上面的記錄集舉例中,如果有 100 個記錄和 5 個欄位,內迴圈將執行 100*5 = 500 次,所有的複製和重新分配所花的時間與 500*500 = 250,000 成正比。這對於中等大小的記錄集來說複製操作太多了。
在本例中,代碼可以用 Response.Write() 或內嵌指令碼 (<% = fld.Value %>) 替代字串串聯來改進。如果啟用了響應緩衝的話(應該的),這樣做就會更快,因為 Response.Write 只將資料附加到響應緩衝的末尾。並不涉及重新分配,因此效率很高。
在將 ADO 記錄集轉換為 HTML 表的特定情況下,應考慮使用 GetRows 或 GetString。
如果在 JScript 中串聯字串,特別建議使用 += 運算子,即,使用 s += ?某字串?,而不使用 s = s + ?某字串?。
技巧 21:啟用瀏覽器和代理緩衝
在預設情況下,ASP 禁止在瀏覽器和代理中進行緩衝。這是有意義的,因為就實質而言 ASP 頁面是動態,上面有隨時間不斷變化的潛在資訊。如果頁面不要求在每個視圖上進行重新整理,您應啟用瀏覽器和代理緩衝。這可使瀏覽器和代理在一定的時間內使用頁面的“緩衝”副本,您可以控制時間的長短。緩衝可以大大減輕伺服器上的負載,縮短使用者的等待時間。
哪一種動態網頁面可作為要緩衝的頁面呢?下面舉一些例子:
- 天氣預報頁面,在此頁面上,每隔 5 分鐘更新一次天氣預報。
- 列出新聞條目或新聞稿的首頁,它一天更新兩次。
- 共同基金業績列表,在此列表中,基本統計資訊每隔幾小時更新一次。
注意,在使用瀏覽器或代理緩衝的情況下,Web 服務器上記錄的訪問次數減少了。如果您想準確地測量所有整頁模式或張帖公布,您就不希望使用瀏覽器和代理緩衝。
瀏覽器緩衝由 HTTP“到期”前序控制,該前序由 Web 服務器發送給瀏覽器。ASP 提供兩個簡單的機制發送此前序。要設定頁面使其過多少分鐘後到期,則應設定 Response.Expires 屬性。下面的例子告訴瀏覽器內容在 10 分鐘內到期:
<% Response.Expires = 10 %>
若將 Response.Expires 設定為負數或 0,則禁用緩衝。一定要使用大的負數,如 -1000(略多於一天),以避免伺服器和瀏覽器時鐘之間的不匹配。第二個屬性 Response.ExpiresAbsolute 將使您設定內容到期的具體時間:
<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>
您可以不使用
Response 對象設定到期時間,而將 <META> 標記寫進 HTML,通常寫在 HTML 檔案的 <HEAD> 部分。一些瀏覽器將遵照此指令,而代理則不然。
<META HTTP-EQUIV=?Expires? VALUE=?May 31,2001 13:30:15?>
最後,您可以使用 Response.CacheControl 屬性,指示其內容是否可以讓 HTTP 代理緩衝。若將此屬性設定為“Public”,代理就可以緩衝此內容。
<% Response.CacheControl = ?Public? %>
在預設情況下,此屬性被設定為“Private”。注意,對於顯示某使用者特定資料的頁面,不應啟用代理緩衝,因為代理可能給使用者提供屬於其他使用者的頁面。
技巧 22:儘可能使用 Server.Transfer 代替 Response.Redirect
Response.Redirect 讓瀏覽器請求另一個頁面。此函數常用來將使用者重新導向到一個登入或錯誤頁面。因為重新導向強制請求新頁面,結果是瀏覽器必須到 Web 服務器往返兩次,且 Web 服務器必須多處理一個請求。IIS 5.0 引入了一個新的函數 Server.Transfer,它將執行轉移到同一台伺服器上的另一個 ASP 頁。這樣就避免多餘的瀏覽器-Web-伺服器的往返,從而改善了總體系統效能以及縮短了使用者的回應時間。檢查“重新導向”中的“新的方向”,上面應該是 Server.Transfer 和 Server.Execute。
另請參見 Leveraging ASP in IIS 5.0,瞭解 IIS 5.0 和 ASP 3.0 新功能的完整列表。
技巧 23:在目錄 URL 中使用後斜杠
一個相關的技巧是確保在指向目錄的 URL 中使用後斜杠 (/)。如果您省略了後斜杠,瀏覽器就會向伺服器發出請求,只是為了告訴伺服器,它在請求目錄。瀏覽器就會發出第二個請求,將斜杠附加到 URL 後面,只有此後,伺服器才能以該目錄的預設文件或目錄列表(如果沒有預設文件且啟用了瀏覽目錄的話)響應。附加斜杠可省去第一個、無用的住返。為便於使用者閱讀,可以省略顯示名稱中的後斜杠。
例如,寫:
<a href=?http://msdn.microsoft.com/workshop
/? title=?MSDN Web
Workshop?>http://msdn.microsoft.com/workshop</a>
這也適用於指向 Web 網站上首頁的 URL:使用下面的:<a href=?http://msdn.microsoft.com/?>,而不使用 <a href=?http://msdn.microsoft.com?>。
技巧 24:避免使用伺服器變數
訪問伺服器變數會使 Web 網站向伺服器發出一個特殊請求,並收集所有伺服器變數,而不只是您請求的那個變數。這種情況類似於,在發黴的閣樓上,在一個檔案夾中尋找某個檔案。當您想要找那個檔案時,您必須去閣樓上,先找到檔案夾,然後才能找到這份檔案。當您請求伺服器變數時,發生的情況是一樣的 - 您第一次請求伺服器變數時,就會使效能受到影響。後面的對其它伺服器變數的請求,則不會對效能產生影響。
決不要訪問非限定的
Request 對象(例如,Request("Data"))。對於不在 Request.Cookies、Request.Form、Request.QueryString 或 Request.ClientCertificate 中的項目,則隱式調用 Request.ServerVariables。Request.ServerVariables 集合比其它集合慢得多。
技巧 25:升級到最新和最出色的
系統組件是恒定的,我們建議您將它們升級到最新和最好的配置。最好升級到 Windows 2000(因此,也應升級到 IIS 5.0、ADO 2.5、MSXML 2.5、Internet Explorer 5.0、VBScript 5.1 和 JScript 5.1)。在多處理器電腦上,實施 IIS 5.0 和 ADO 2.5 可顯著改善效能。在 Windows 2000 下,ASP 可以很好地擴充到四個處理器或更多,而在 IIS 4.0 下,ASP 的擴充性不能超出兩個處理器。在應用程式中使用的指令碼代碼和 ADO 越多,升級到 Windows 2000 之後,效能的改善就會越多。