编译:甘冀平·yesky
技巧11:使用response buffering
通过打开“response buffering”可以缓冲一个值得输出的整个页面内容,这将最小化输出到浏览器的数据量,从而提高了整体性能。每一次输出都耗费许多,所以写得越少,效果越好。tcp/ip在发送少量大的数据包时,要比发送大量小的数据包工作效率高,因为它是慢速启动并不断发送的。
有2种方法打开response buffering。首先,可以使用inte.net 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输出。新版的inte.net 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”的。注意:不要让代理缓冲那些显示给特定用户的页面,因为代理可能会将属于其他用户的页面送给当前用户。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器