许多站点由独立于浏览器创建的 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"
到
。在第三次迭代中,它必须再次重新分配
,并复制三个字符到
。在第 N 次(26 次)迭代中,它必须重新分配并复制 N 个字符到
。就是 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 生来就是动态的,具有潜在地对时间敏感的信息。如果有一个不需要对每次查看进行刷新的页,则应该启用浏览器和代理缓存。这使得浏览器和代理能在某一段时间内,使用某一页的缓存副本,这时间的长短可以控制。缓存能明显减轻服务器负荷,使用户的感受好一些。