- Login
帳號:
密碼:
ASP MENU
線上教學
   ASP 教學
VB.NET 教學
JSP 教學
JAVA 教學
完整 ASP 教學
程式下載
   ASP 程式下載
提供 ASP 程式
程式量身訂做
   收費標準
填寫需求表
討論交流專區
   程式討論區
電腦資訊交流
工作機會
   社會人就職情報
汎亞人力銀行
大台中人力銀行
大高雄人力銀行
相關連結
   ASP 虛擬空間
ASP 相關網站
聯絡我們
   意見信箱
加入會員程式討論區線上購物回首頁
ASP 教學
如何增強ASP程序性能(3)
技巧11:使用Response Buffering

  通過打開“response buffering”可以緩衝一個值得輸出的整個頁面內容,這將最小化輸出到瀏覽器的數據量,從而提高了整體性能。每一次輸出都耗費許多,所以寫得越少,效果越好。TCP/IP在發送少量大的數據包時,要比發送大量小的數據包工作效率高,因為它是慢速啟動並不斷發送的。

  有2種方法打開Response Buffering。首先,可以使用Internet Services Manager為整個應用程序打開response buffering,這是推薦的方式,而且在IIS4.0和IIS5.0中,默認狀態下,response buffering是打開的。其次,在每一頁面上,可以在頭部放置如下代碼開打開response buffering:

< % Response.Buffer = True % >

  這段代碼必須在任何數據輸出到瀏覽器前被執行(就是說,在任何html內容顯示前和在任何cookie被設置前)。通常情況下,為整個應用程序打開response buffering是很好的方案,這麼做後就不用在每個頁面頭部設置如上的代碼。

  關於打開response buffering的一個通用問題是:用戶必須要等待整個頁面全部產生後,才能看到內容。對於一個長時間運行的頁面來說,可以設置Response.Buffer=False關閉緩衝。然後,好的策略是利用Response.Flush方法,它將輸出所有已被ASP描述的HTML內容到瀏覽器。比如,在描述了一個1,000行表格的100行後,ASP就可以使用Response.Flush來強迫輸出這100行的內容到瀏覽器,這時用戶就可以看到前100行數據,同時其餘的行數據正在準備生成。

  注意,關於上面的1,000行表格輸出的例子,對於一些瀏覽器器來說,除非遇到< /table >標記,它們不會輸出表格的任何內容。如果這樣,可以將表格分割成許多含有少量行的多個表格,然後在每一個表格產生後,調用Response.Flush輸出。新版的Internet Explorer在整個表格下載後才顯示內容,並且,如果定義了表格的列寬度,生成表格的速度將特別快。

關於打開response buffering的另外一個問題是:當生成非常大的頁面時,將消耗非常大的服務器內存。

技巧12:批處理單行腳本和Response.Write命令

  VBScript語法< % = expression % >的意思是輸出expression的數值。如果response buffering沒有打開,每個這樣的語句將按照許多小數據包的形式輸出數據到瀏覽器,這將降低程序性能。因此,請使用下面的技巧:替換緊挨著的多個一行表達式調用為一個調用,用Response.Write名稱輸出。比如,在下面的例子中,對於每行每個字段的輸出,只有一個寫操作:

<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>

下面是更有效率的代碼,每行一個輸出:

<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 buffering關閉時,這個技巧非常得有用。最好是打開response buffering,這樣就可以看到批量的Response.Wwrite是如何提高了程序性能。

技巧13:使用< OBJECT >標記引用對象

  如果需要引用除代碼路徑外的對象(尤其是服務器、Application範圍的對象),請在Global.asa文件中使用
< object runat=server id=objname >標記來定義它們,而不要使用Server.CreateObject方法。使用Server.CreateObject方法可以立即創建對象,這樣如果隨後不使用它,就浪費了資源。使用
< object id=objname >標記可以定義對象objname,但是直到它的屬性或者方法首次使用時,objname才實際創建。

技巧14:避免在循環中串聯字符串

許多人在循環中建立一個字符串,就象下面的樣子:

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

  在第1層循環時,S的值是“A”;第2層循環時,VBScript要重新分配字符串,拷貝了2個字符(“AB”)到S中;第3層循環時,需要再重新分配並且拷貝3個字符到S中。在第N層循環時,就需要重新分配並拷貝N個字符到S中。那就是1+2+3+...+N的總和,也就是N*(N+1)/2個拷貝。

  在上面的記錄集例子中,如果有100個記錄和5個字段,內部循環就要執行100*5=500次,並且,完成所有拷貝和再分配任務的時間將接近500*500=250,000。這還是一個適當尺寸記錄集的拷貝工作。

  在這個例子中,可以通過替換字符串連接為Response.Write()或者行內腳本(< % =fld.Value % >)的方法提高程序性能。如果response buffering打開(也應該打開),這將很快,因為Response.Write僅僅附加數據在緩衝區的尾部,而且不需要再分配。

  如果用JScript連接字符串,強烈建議使用“+=”操作符,就是說,使用s+=“字符串”,而不是s = s+“字符串”。

技巧15:打開瀏覽器和代理的緩衝

  默認情況下,ASP禁止了瀏覽器和代理的緩衝功能。如果有一個每次都不要更新的頁面,就應該打開瀏覽器和代理的緩衝,這將允許瀏覽器和代理在一段時間內使用該頁面的“緩衝”拷貝數據。緩衝能夠大大地減輕服務器的數據轉載量,並提高用戶的瀏覽性能。

哪些類別的動態頁面適合被緩存呢?下面是一些例子:

天氣頁面,每5分鐘更新一次
新聞或版本列表頁面,每天更新2次
  注意:使用瀏覽器或者代理緩存後,對Web服務器的點擊次數就會減少。如果想精確地了解所有頁面,或者對於郵遞廣告,就不適於使用瀏覽器和代理緩存了。

  瀏覽器緩存由HTTP“Expires”頭參數控制,它由Web服務器發送給瀏覽器。ASP提供了2個簡單的方法發送這個頭部參數。設置頁面在未來一定時間內到期,可以使用Response.Expires屬性。下面的例子將告訴瀏覽器內容在10分鐘後過期:

< % Response.Expires = 10 % >

  設置Response.Expires為負數或者0,就禁止了緩存。對第2個屬性Response.ExpiresAbsolute的設置,允許指定在一個特殊時間到來時內容過期。

< % Response.ExpiresAbsolute = #May 31,2001 13:30:15# % >

  除了使用Response對象來設置到期時間,還可以在HTML文件頭部寫< META >標記。儘管代理不會注意到這個標記,但是一些瀏覽器可以。

< META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15" >

  最後,對於HTTP代理,使用Response.CacheControl可以指示是否緩存內容。設置屬性為“Public”,打開代理緩存內容的功能。

< % Response.CacheControl = "Public" % >

  默認情況下,這個屬性是設置成“Private”的。注意:不要讓代理緩衝那些顯示給特定用戶的頁面,因為代理可能會將屬於其他用戶的頁面送給當前用戶。



頂端
本網頁最佳瀏覽模式為:瀏覽器 IE4.0 以上    解析度: 800 x 600
Copyright © 2000-2020 COOLASP All Rights Reserved