答案: 许多人在循环中创建类似这样的字符串:
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 + "某字符串"。
上一个:避免重新定义数组
下一个:在COM对象中封装代码