響應|響應 本篇教程主要介紹:將ASP產生的內容寫入響應流中最有效方法,即用 Response.Write 和 <%=%> 向用戶端輸出內容時的效率測試。
使用ASP的一個最主要原因是在伺服器上產生動態內容。所以很明顯,我們測試的起點是確定將動態內容發送到響應流中的最適合的方式。
在多種選擇中,有兩個是最基本的:一是使用內聯ASP標記,另一個是使用Response.Write 語句。
為測試這些選擇,我們建立了一個簡單的ASP頁面,其中定義了一些變數,然後將它們的值插入表格中。雖然這個頁面很簡單也不是很實用
,但它允許我們分離並測試一些單獨的問題。
使用ASP內聯標記
第一個測試包括使用內聯ASP標記<%=x%>,其中x是一個已賦值的變數。到目前為止,這個方法是最容易執行的,並且它使頁面的HTML部分
保持一種易於閱讀和維護的格式。
<%
OPTION EXPLICIT '此句作用是強制使用每個變數前必須先定義
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim EMail
Dim BirthDate
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "New York"
State = "NY"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = "john@public.com"
BirthDate = "1/1/1950"
%>
<HTML>
<HEAD>
<TITLE>Response Test</TITLE>
</HEAD>
<BODY>
<H1>Response Test</H1>
<TABLE>
<tr><td><b>First Name:</b></td><td><%=FirstName%></td></tr>
<tr><td><b>Middle Initial:</b></td><td><%=MiddleInitial%></td></tr>
<tr><td><b>Last Name:</b></td><td><%=LastName%></td></tr>
<tr><td><b>Address:</b></td><td><%=Address%></td></tr>
<tr><td><b>City:</b></td><td><%=City%></td></tr>
<tr><td><b>State:</b></td><td><%=State%></td></tr>
<tr><td><b>Phone Number:</b></td><td><%=PhoneNumber%></td></tr>
<tr><td><b>Fax Number:</b></td><td><%=FaxNumber%></td></tr>
<tr><td><b>EMail:</b ></td><td><%=EMail%></td></tr>
<tr><td><b>Birth Date:</b></td><td><%=BirthDate%></td></tr>
</TABLE>
</BODY>
</HTML>
/app1/response1.asp的完整代碼
以前的最佳(反應速度) = 8.28 msec/page
在HTML的每一行使用Response.Write 語句
許多比較好的學習文檔建議避免使用前面的那種方法。其主要理由是,在輸出頁面和處理頁面施加反應時間的過程中,如果網頁伺服器不
得不在發送純HTML和處理指令碼之間進行轉換,就會發生一種被稱為上下文轉換的問題。大部分程式員一聽到這裡,他們的第一反應就是將原始
的HTML的每一行都封裝在Response.Write函數中。
…
Response.Write("<html>")
Response.Write("<head>")
Response.Write("<title>Response Test</title>")
Response.Write("</head>")
Response.Write("<body>")
Response.Write("<h1>Response Test</h1>")
Response.Write("<table>")
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
Response.Write("<tr><td><b>Middle Initial:</b></td><td>" & MiddleInitial & "/td ></tr>")
…
/app1/response2.asp的片段
以前的最佳(反應速度) = 8.28 msec/page
反應時間 = 8.08 msec/page
差= -0.20 msec (減少 2.4%)
我們可以看到,使用這種方法與使用內聯標記的方法相比在效能上獲得的收益非常小,這也許是因為頁面給伺服器裝載了一大堆小的函數
調用。這種方法最大的缺點是,由於現在HTML都嵌入指令碼中,所以指令碼代碼變得更加冗長,更加難以閱讀和維護。
使用封裝函數
當我們試圖使用Response.Write 語句這種方法時,最令人灰心的發現可能就是Response.Write 函數不能在每行的結尾處放置一個CRLF 。
因此,當你從瀏覽器中閱讀原始碼時,本來布置得非常好的HTML,現在成了沒有結束的一行。我想,你的下一個發現可能會更令你恐怖:在
Response 對象中沒有其姊妹函數Writeln 。所以,一個很明顯的反應就是為Response.Write 函數建立一個封裝函數,以便給每一行都附加一
個CRLF 。
…
writeCR("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
…
SUB writeCR(str)
Response.Write(str & vbCRLF)
END SUB
/app1/response4.asp的片段
以前的最佳(反應速度)= 8.08 msec/page
反應時間= 10.11 msec/page
差 = +2.03 msec (增加 25.1%)
當然,由於這種方法有效地使函數調用次數加倍,其對效能的影響也很明顯,因此要不惜一切代價避免。具有諷刺意味的是CRLF也向反應
流中為每行增加了2個位元組,而這是瀏覽器不需要呈現到頁面上的。格式化良好的HTML所做的一切就是讓你的競爭者更容易閱讀你的HTML原始碼
並理解你的設計。
將連續的Response.Write 串連到一個單獨語句中
不考慮我們前面用封裝函數進行的測試,下一個合乎邏輯的步驟就是從單獨的Response.Write 語句中提取出所有的字串,將它們串連到
一個單獨語句中,這樣就減少了函數調用的次數,極大地提高了頁面的效能。
…
Response.Write("<html>" &_
"<head>" &_
"<title>Response Test< /title >" &_
"</head>" &_
"<body>" &_
"<h1>Response Test</h1>" &_
"<table>" &_
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr