欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微软建议的ASP性能优化28条守则(7)

程序员文章站 2022-06-18 16:01:42
技巧 20:避免在循环语句中使用字符串串联 许多人在循环语句中建立一个字符串,如下所示: s = ?? & vbcrlf for each fld in rs.fi...
技巧 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 += ?某字符串?,而不使用 s = s + ?某字符串?。

技巧 21:启用和代理缓存
在默认情况下,asp 禁止在浏览器和代理中进行缓存。这是有意义的,因为就实质而言 asp 页面是动态的,上面有随时间不断变化的潜在信息。如果页面不要求在每个视图上进行刷新,您应启用浏览器和代理缓存。这可使浏览器和代理在一定的时间内使用页面的“缓存”副本,您可以控制时间的长短。缓存可以大大减轻服务器上的负载,缩短用户的等待时间。

哪一种动态页面可作为要缓存的页面呢?下面举一些例子:

天气预报页面,在此页面上,每隔 5 分钟更新一次天气预报。
列出新闻条目或新闻稿的主页,它一天更新两次。
共同基金业绩列表,在此列表中,基本统计信息每隔几小时更新一次。
注意,在使用浏览器或代理缓存的情况下,web 服务器上记录的访问次数减少了。如果您想准确地测量所有页面视图或张帖公布,您就不希望使用浏览器和代理缓存。

浏览器缓存由 http“过期”报头控制,该报头由 web 服务器发送给浏览器。asp 提供两个简单的机制发送此报头。要设置页面使其过多少分钟后到期,则应设置 response.expires 属性。下面的例子告诉浏览器内容在 10 分钟内过期:

<% response.expires = 10 %>


若将 response.expires 设置为负数或 0,则禁用缓存。一定要使用大的负数,如 -1000(略多于一天),以避免服务器和浏览器时钟之间的不匹配。第二个属性 response.expiresabsolute 将使您设置内容过期的具体时间:

<% response.expiresabsolute = #may 31,2001 13:30:15# %>


您可以不使用 response 对象设置过期时间,而将 <meta> 标记写进 html,通常写在 html 文件的 <head> 部分。一些浏览器将遵照此指令,而代理则不然。

<meta http-equiv=?expires? value=?may 31,2001 13:30:15?>


最后,您可以使用 response.cachecontrol 属性,指示其内容是否可以让 http 代理缓存。若将此属性设置为“public”,代理就可以缓存此内容。

<% response.cachecontrol = ?public? %>


在默认情况下,此属性被设置为“private”。注意,对于显示某用户特定数据的页面,不应启用代理缓存,因为代理可能给用户提供属于其他用户的页面。