台灣最大程式設計社群網站
線上人數
1007
 
會員總數:245392
討論主題:189182
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 改善ASP效能的訣竅-20 (Nancy Cluts 著)
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
改善ASP效能的訣竅-20 (Nancy Cluts 著)
價值 : 0 QP  點閱數:1929 回應數:0

樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
訣竅 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 += ?some string?,而不使用 s = s + ? some string?。

本篇文章發表於2000-09-09 00:00
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.