wenku.sharew.cn
提高ASP程序执行效率和页面打开速度技巧
浏览:6 | 发布时间:2018-1-7 17:54:02

技巧一:提高使用Request集合的效率

访问一个ASP集合来提取一个值是费时的、占用计算资源的过程。因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量。例如:
效率低,速度慢:

If Len(Request.Form("username"))<1 or Len(Request.Form("username"))>15 Then response.write("用户名错误!")
If Len(Request.Form("password"))<1 or Len(Request.Form("password"))>15 Then response.write("密码错误!")
response.write("用户名:" & Request.Form("username"))
response.write("密码:" & Request.Form("password"))

效率高,速度快:

username=Request.Form("username") 
password=Request.Form("password") 
If Len(username)<1 or Len(username)>15 Then response.write("用户名错误!")
If Len(password)<1 or Len(password)>15 Then response.write("密码错误!")
response.write("用户名:" & username)
response.write("密码:" & password)

技巧二:直接访问适当的集合
如果不是别无选择,否则不要使用 username=Request("username") 的这样的形式来获取参数,因为这将按顺序搜索全部的集合QueryString、Form、Cookies、ClientCertificate、ServerVarible直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。
相关文章:ASP中Request读取优先级顺序

技巧三:在费时操作前使用Response.IsClientConnected属性
使用Response.IsClientConnected是观察用户是否仍连到服务器并正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查游览者是否已离线:

……
If Response.IsClientConnected Then 
    Response.Flush 
Else 
    Response.End 
End If 
……

技巧四:不要混用脚本引擎
我们知道,ASP页面中既可以使用VBScript,也可以使用JavaScript。但是在同一个页面上同时使用VBScript和JavaScript则是不可取的。因为服务器必须实例化并尝试缓存两个(而不是一个)脚本引擎,这在一定程度上增加了系统负担。因此,从性能上考虑,不应在同一页面中混用多种脚本引擎。
ASP默认的脚本是VBScript,在ASP文件的第一行写入代码:<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>,其中936表示文件编码,对应文件编码为ANSI,字符编码可为GB2312,若改为65001,则对应文件和字符编码都为UTF-8。

技巧五:优化ASP中的ADO操作
通常面言,数据构成了WEB站点的实际内容。所以,优化ADO操作以加速ASP代码执行,十分有用: 
1、仅选择所需的列。当打开ADO记录集时,除非需要获得所有的列,否则不应自动地使用表名(即SELECT *)。使用单独的列意味着将减少发送到服务器或从服务器取出的数据量。即使需要使用全部列,单独地命名每个列也会获得最佳的性能,因为服务器不必再解释这些列的名字。
2、尽可能的使用存储过程。存储过程是预先编译的程序,含有一个已经准备好的执行计划,所以比SQL语句执行更快。
3、使用适当的光标和锁定模式。如果所做的全部工作只是从记录集中读取数据,并将其显示在屏幕上,那么就使用缺省的只能前移、只读的记录集。ADO用来维护记录和锁定的细节的工作越少,执行的性能就越高。
4、获取记录值使用Rs(字段编号)方式例如:
A、Rs("字段名称")方式【效率低,速度慢】

dim rs,sql
sql="select [title],[code] from [products]"
Set rs=server.createobject("ADODB.RECORDSET")
rs.open sql,conn,1,1
do while Not rs.EOF
    Response.Write("产品名称:" & rs("title") & "[产品编号:" & rs("code") & "]")
    rs.MoveNext
loop

B、rs.Fields().Value或rs.Fields()方式【效率低,速度和A几乎一样

'上面4句一样
do while Not rs.EOF
    Response.Write("产品名称:" & rs.Fields(0).Value & "[产品编号:" & rs.Fields(1) & "]")
    rs.MoveNext
loop

C、Rs(字段编号)方式【效率高,速度快】

'上面4句一样
do while Not rs.EOF
    Response.Write("产品名称:" & rs(0) & "[产品编号:" & rs(1) & "]")
    rs.MoveNext
loop

技巧六:优化ASP动态生成的内容的输出方式
1、使用ASP的内嵌标记<%=x%>
其中x是一个变量。这是使用最方便的方法,而且它可以让页面的HTML部分变得更容易阅读和维护。

<%
dim name1,sex,qq,url
name1="凌陈亮"
sex="男"
qq="57404811"
url="www.lingchenliang.com"
%>
<table>
<tr><td>姓名:</td><td><%=name1%></td></tr>
<tr><td>性别:</td><td><%=sex%></td></tr>
<tr><td>QQ:</td><td><%=qq%></td></tr>
<tr><td>网址:</td><td><%=url%></td></tr>
</table>

以上为测试代码片断
响应时间 = 8.28 毫秒/页

2、使用Response.Write输出每一行HTML代码
许多优秀的文献指出,应当避免使用前面的内嵌标记方法,因为它导致一个称为"上下文切换"的操作。这个操作发生在Web服务器所处理的代码类型发生变化的时候(从纯HTML的发送到脚本处理,或反过来),这种切换需要一定的时间。许多程序员在了解了这一点之后,他们的第一个反应是将每一行HTML代码都用Response.Write函数来输出:

<%
dim name1,sex,qq,url
name1="凌陈亮"
sex="男"
qq="57404811"
url="www.lingchenliang.com"
response.write("<table>")
response.write("<tr><td>姓名:</td><td>" & name1 & "</td></tr>")
response.write("<tr><td>性别:</td><td>" & sex & "</td></tr>")
response.write("<tr><td>QQ:</td><td>" & qq & "</td></tr>")
response.write("<tr><td>网址:</td><td>" & url& "</td></tr>")
response.write("</table>")
%>

以上为测试代码片断
响应时间 = 8.08 毫秒/页
和内嵌标记版本相比,我们所看到的性能改善非常小,简直令人惊讶。这或许是因为页面中多出了许多函数调用。不过这种方法还有一个更大的缺点,由于HTML代码嵌入到了函数内,脚本代码变得非常冗长,阅读和维护都不方便。

3、使用封装函数
Response.Write并不会在文本行的末尾加上CRLF(Carriage Return - Line Feed,回车换行),这是使用上面这种方法最令人失望的地方。尽管已经在服务器端把HTML代码作了很好的格式化,但在浏览器中看到的仍旧只有长长的一行代码。不过失望的不仅是这一个问题,人们很快就发现不存在能够自动添加CRLF的Response.WriteLn函数。一个很自然的反应就是创建Response.Write的封装函数,在每行的后面加上CRLF:

<%
dim name1,sex,qq,url
name1="凌陈亮"
sex="男"
qq="57404811"
url="www.lingchenliang.com"
writecr("<table>")
writecr("<tr><td>姓名:</td><td>" & name1 & "</td></tr>")
writecr("<tr><td>性别:</td><td>" & sex & "</td></tr>")
writecr("<tr><td>QQ:</td><td>" & qq & "</td></tr>")
writecr("<tr><td>网址:</td><td>" & url& "</td></tr>")
writecr("</table>")
sub writecr(str)
    response.write(str & vbCRLF)
end sub
%>

以上为测试代码片断
响应时间 = 10.11 毫秒/页
结果是性能的大大下降。当然,这主要是因为这种方法使得函数的调用次数加倍,它对性能的影响非常明显。应当不惜代价地避免这种用法,CRLF导致每行的末尾多了两个字节,而这两个字节对于浏览器显示页面是没有用的。在大多数情况下,浏览器端HTML代码的格式美观只是方便了你的竞争者阅读和理解页面的设计。

4、合并多个Response.Write
将所有字符串从分开的Response.Write语句合并到一个语句,从而减少函数调用次数、提高代码运行效率。

<%
dim name1,sex,qq,url
name1="凌陈亮"
sex="男"
qq="57404811"
url="www.lingchenliang.com"
response.write("<table>" &_
	"<tr><td>姓名:</td><td>" & name1 & "</td></tr>" &_
	"<tr><td>性别:</td><td>" & sex & "</td></tr>" &_
	"<tr><td>QQ:</td><td>" & qq & "</td></tr>" &_
	"<tr><td>网址:</td><td>" & url& "</td></tr>" &_
	"</table>")
%>

以上为测试代码片断
响应时间 = 7.05 毫秒/页

5、合并多个Response.Write,且在每一行的末尾增加vbCRLF
也有人非常关注他们的HTML代码在浏览器端是否美观,因此我们又在每一行HTML代码的末尾加上了一个回车,使用的是vbCRLF常量,其他的测试代码与上例一样。

<%
dim name1,sex,qq,url
name1="凌陈亮"
sex="男"
qq="57404811"
url="www.lingchenliang.com"
response.write("<table>" & vbCRLF &_
	"<tr><td>姓名:</td><td>" & name1 & "</td></tr>" & vbCRLF &_
	"<tr><td>性别:</td><td>" & sex & "</td></tr>" & vbCRLF &_
	"<tr><td>QQ:</td><td>" & qq & "</td></tr>" & vbCRLF &_
	"<tr><td>网址:</td><td>" & url& "</td></tr>" & vbCRLF &_
	"</table>")
%>

以上为测试代码片断
响应时间 = 7.63 毫秒/页
测试结果是性能略有下降,这可能是因为增加了字符串连接操作,同时输出的文本也增加了。

6、通过脚本启用缓冲
在ASP脚本的前面加入 Response.Buffer=True ,IIS将缓冲页面内容: 

在第4种代码的上方加入<% Response.Buffer = true %>
响应时间 = 6.08 毫秒/页

7、通过配置服务器启用缓冲
IIS7设置方法如下:点击左侧“网站”列表下要配置的站点,在中间侧栏里双击“ASP”图标,然后将“启用缓冲”设置为“True”,然后点击右侧“操作”栏里的“应用”即配置完成。
响应时间 = 5.57 毫秒/页
缓冲是改善性能的一种极好的方法,因此将服务器设置成默认启用缓冲是具有重要意义的。如果由于某种原因,启用缓冲导致了页面行为不正常,只需在该页面内加上 Response.Buffer=False 即可。启用缓冲时,在整个页面处理完毕之前用户不会看到任何内容,这是它的一个缺点。

8、ASP代码中注释对执行效率几乎无任何影响
许多HTML开发者知道,加入HTML注释是一种坏习惯。这是因为:首先,注释增加了数据传输量;其次,HTML注释为其它开发者提供了有关页面组织的信息。那么,ASP页面中的注释又怎样?ASP中的注释永远不会被浏览器看到,但是它们增加了ASP引擎所解析的脚本的大小。
在这个测试中,我们加入了20行注释,每行80个字符,总共1600个字符。
基  准 = 5.57 毫秒/页
响应时间 = 5.58 毫秒/页

这个测试结果令人惊讶。ASP注释对性能影响极小,或者没有影响。但ASP注释有利于我们阅读和理解程序代码,对于以后的维护、修改和二次开发有着非常大的作用。

本文来自: 凌陈亮博客,转载请保留出处!

文库内容仅供参考,本站不保证其内容的有效性,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。
如果涉及不良内容、个人隐私、版权问题等,敬请举报投诉,本站将立即处理。

友情链接:手写查字典 小说下载查成语 经验文献
© 2017-2018 wenku.sharew.cn 桂ICP备13001205号-1 联系方式

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏