#12004/12/28 12:27:09
asp误区
相信现在很多朋友正在学习ASP,对于很多初学者,在编写ASP程时很很有不少误解之处。在这里我根据自己的经验,通过一系列的测试所得的结果和大家谈谈初学者在编写ASP时应注意的事,相信通过下面的讲解对提升ASP性能有所帮助的。
注:文中所得到的测试数据都是通过微软所设计的一套软件Microsoft''s Web Application Stress Tool (WAST)来完成,(网址http://webtool.rte.microsoft.com/,支持的操作平台只有Windows NT 4.0和 Windows 2000)使用的服务器规格为Pentium 233 CPU搭配128 MB的内存,前端操作平台则是Pentium II 450搭配256MB的内存。
1、在ASP程序当中穿插html原代码该注意的事项
<% OPTION EXPLICIT
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim Email
Dim BirthDate
FirstName = "Kuku"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "Bei Jing"
State = "BJ"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = kuku@public.com
BirthDate = "1/1/1950"
%>
<HTML>
<HEAD>
<TITLE>Response Test</ TITLE >
</HEAD>
<BODY>
<H1>Response Test</H1>
<TABLE>
<tr><td><b>First Name:</b></td><td><%= FirstName %></td></tr>
<tr><td><b>Middle Initial:</b></td><td><%= MiddleInitial %></td></tr>
<tr><td><b>Last Name:</b></td><td><%= LastName %></td></tr>
<tr><td><b>Address:</b></td><td><%= Address %></td></tr>
<tr><td><b>City:</b></td><td><%= City %></td></tr>
<tr><td><b>State:</b></td><td><%= State %></td></tr>
<tr><td><b>Phone Number:</b></td><td><%= PhoneNumber %></td></tr>
<tr><td><b>Fax Number:</b></td><td><%= FaxNumber %></td></tr>
<tr><td><b>EMail:</b></td><td><%= EMail %></td></tr>
<tr><td><b>Birth Date:</b></td><td><%= BirthDate %></td></tr>
</TABLE>
</BODY>
</HTML>
像<%=变量值%>这样子的写法是最多人用的,或许有人会这样写<%Response.Write 变量值%>,但两者执行结果一模一样,但前者在执行效率上会比后者来的差,上面那一段程序经过测试的结果,其反应时间为8.28 msec (千分之八点二八秒),我将程序改写成下面的形式(将所有的字符串变量与Html码以Response.Write的方式来产生)
<% OPTION EXPLICIT
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim Email
Dim BirthDate
FirstName = "Kuku"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "Bei Jing"
State = "BJ"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = kuku@public.com
BirthDate = "1/1/1950"
Response.Write("<html>")
Response.Write("<head>")
Response.Write(" <title>
Response Test</title>")
Response.Write("</head>")
Response.Write("<body>")
Response.Write("<h1>Response Test</h1>")
Response.Write("<table>")
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
Response.Write("<tr><td><b>Middle Initial:</b></td><td>" & MiddleInitial &
"</td></tr>")
Response.Write("<tr><td><b>Last Name:</b></td><td>" & LastName & "</td></tr>")
Response.Write("<tr><td><b>Address:</b></td><td>" & Address & "</td></tr>")
Response.Write("<tr><td><b>City:</b></td><td>" & City & "</td></tr>")
Response.Write("<tr><td><b>State:</b></td><td>" & State & "</td></tr>")
Response.Write("<tr><td><b>Phone Number:</b></td><td>" & PhoneNumber &
"</td></tr>")
Response.Write("<tr><td><b>Fax Number:</b></td><td>" & FaxNumber & "</td></tr>")
Response.Write("<tr><td><b>EMail:</b></td><td>" & EMail & "</td></tr>")
Response.Write("<tr><td><b>BirthDate:</b></td><td>" & BirthDate & "</td></tr>")
Response.Write("</table>")
Response.Write("</body>")
Response.Write("</html>")
%>
结果响应时间缩短为8.08 msec, 比之前的程序快了 0.2 msec,加快了2.4%,主要的原因在于将Html码内嵌在Script中,服务器在执行ASP时不需要在ASP标记<%%>中切换来切换去,整体而言性能是提高了,但是却增加了程序阅读的困难性,而且也拉长了开发程序的时间 。如果我们把所有的Response.Write精简为只用一个Response.Wrie来完成,如下所示,会有什么结果呢 ?
<%.............
Response.Write("<html>" & _
"<head>" & _
"<title>Response Test</title>" & _
"</head>" & _
"<body>" & _
"<h1>Response Test</h1>" & _
"<table>" & _
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _
............
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
%>
响应时间降低到 7.51 msec,又比上面的程序快了 0.57 msec,整体性能增加了 12.7%,这是因为减少了重复调用response.Write操作方法所导致的结果,可以看出这是最佳化之后的结果。最后让我们看看以调用子程序的方式来完成上面的程序对整体性能有多大的影响:
<%............
writeCR("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
.......
SUB writeCR(str)Response.Write(str & vbCRLF)
END SUB
%>
重复的调用WriteCR子程序来产生所需要的结果,跟第二个程序来做比较,我们发现反应时间从 8.08 msec 增加到 10.11 msec,总共增加了 2.03 msec,整体性能下降了 25.1%,最大的影响乃是重复的调用子程序所带来的冲击以及大量重复的vbcrlf(占两个byte)字符。
小结:尽量减少程序在ASP标记<%%>中切换的次数,减少使用Response.Write方法的次数和降低vbCRLF字符出现的次数。
2、是否该把快取缓冲打开
在 IIS4.0 中Response.Buffer的默认值是False的,如果使用者要将快取缓冲打开必须将 Response.Buffer 设定为 True ,或是通过IIS的设定来完成,来将快取缓冲打开会有什么影响呢?你会发现服务器在没有将网页完全处理完之前是不会将结果传回客户端的浏览器的,先让我们看看第一种方式的执行结果:
<% OPTION EXPLICIT
Response.Buffer = true
Dim FirstName
..............
%>
反应时间跟前面最佳方式(7.05 msec)比起来加快了 0.97 msec(6.08 msec),整体性能提升13.7%,但这已经是最佳效果了吗?现在看看另一种方式吧!将IIS MMC打开,在站台内容中选取主目录选项,在应用程序选项中勾选启用缓冲处理,结束 IIS MMC ,再执行相同的程序,结果如下:
反应时间:5.57 msec (在往后的测试中,我们将把这个结果值当成基准值),之前最快反应时间:7.05 msec,速度增快 1.48 msec,整体性能提升 21%。看到了吧,这才是我们想要的结果,现在终于知道为什么 IIS 5.0 要将 Response.Buffer 预设为开启的,将缓冲打开唯一的缺点就是除非整个网页处理完,否则使用者是无法看到任何结果。
小结:使用服务器的设定来将快取缓冲打开(如果你具有服务器的管理权),或使用ASP的Response.Buffer=True(如果你是申请免费空间的话)来将快取缓冲打开,这对你的服务器有绝对的影响。
3、是否该给ASP程序加上批注
大多数人在编写ASP 程序从来不加批注,主要原因是害怕所编写的的程序容量过大,传回客户端时间会过长。那么这种看法是否正确呢?
<% OPTION EXPLICIT
''------------------------------------------------------------------------------
-
… 20 行的批注,每行80个字符 …
''------------------------------------------------------------------------------
-
Dim FirstName
.................
%>
基准值 = 5.57 msec,测试结果 = 5.58 msec,速度减低 0.01 msec,整体性能下降 0.1%,总体性能下降的比例无可以不计,因为是因为服务器在执行ASP程序时是不会将批注考虑在内的,所以以后如果你想让程序容易阅读与除错的话那么最好还是加批注为妙,先前的担忧完全是杞人忧天。
4、程序顶端是否要指定预设的Script
在 IIS 中系统指定 VBScript为预设的Script,那如果我们在程序开头指定程序所用的 Script会有什么影响呢?
<%@ LANGUAGE=VBSCRIPT %>
<% OPTION EXPLICIT
Dim FirstName
.....
%>
基准值 = 5.57 msec,测试结果 = 5.64 msec,速度减低 0.07 msec,整体性能下降 1.2%,很明显的在程序开头定义 Script 是会造成性能上的影响的。
小结:除非你要使用不同的 Script 来撰写 ASP,否则没有必要在程序开头定义程序所用的 Script 。
5、若没有用到Session是否该将Session关掉
在这个例子中我假设没有使用到Session,并且在程序一开头将 Session Disable。
<%@ ENABLESESSIONSTATE = FALSE %>
<% OPTION EXPLICIT
Dim FirstName
…....
%>
基准值 = 5.57 msec,测试结果 = 5.46 msec,速度加快 0.11 msec,整体性能提升 2.0%。那么如果我们通过 IIS MMC 来将 Session 关掉会有什么影响呢?开启 Internet 管理员,选取站台,按鼠标右键点选内容,选择主目录选项,在应用程序项中按设定,然后在应用程序选项中将启用作业状态取消勾选,设置改变后测试结果如下:
基准值 = 5.57 msec,测试结果 = 5.14 msec,速度加快 0.43 msec,整体性能提升 7.7%,前后差距很大。
小结:如果你确定不会用到任何的 Session 的话,请在程序开始或通过系统设定将Session 状态关闭。
6、使用 Option Explicit 对性能的影响
用过ASP的朋友一定会知道,如果在程序开头使用了Option Explicit ,那么在往后的程序段中若有使用到变量你就必须定义一个变量名称给指定的变量。而通常使用 Option Explicit 主要有两个原因,一是他让你在变量的控制存取上速度加快,其二是避免你定义错误的变量名称,让我们看看将 Option Explicit 从程序开头删掉会有什么影响:
基准值 = 5.57 msec,测试结果 = 6.12 msec,速度减低 0.55 msec,整体性能下降 9.8%,看来影响似乎挺大的。
小结:请在程序一开头使用 Option Explicit。
7、使用子程序与函式该注意的事项
如果我们使用子程序来产生上面的结果(在子程序中先不使用定义变量的方法)
<%......
CALL writeTable()
SUB writeTable()
Response.Write("<html>" & _
"<head>" & _
…
"<tr><td><b>EMail:</b></td><td>" & EMail & "</td></tr>" & _
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
END SUB
......
%>
基准值 = 5.57 msec,测试结果 = 6.02 msec,速度减低 0.45 msec,整体性能下降 8.1%,再看看若将变量定义加在子程序中会有什么结果产生:
<% OPTION EXPLICIT
CALL writeTable()
SUB writeTable()
Dim FirstName
…
Dim BirthDate
FirstName = "Kuku"
…
BirthDate = "1/1/1950"
Response.Write("<html>" & _
"<head>" & _
" <title>Response Test</title>" & _
"</head>" & _
"<body>" & _
"<h1>Response Test</h1>" & _
"<table>" & _
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _
…
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
END SUB
%>
基准值 = 5.57 msec,测试结果 = 5.22 msec,速度加快 0.35 msec,整体性能提升 6.3%。我们当初刚看到这个结果感到什么惊奇,原来定义变量的方法对性能有这么大的影响,即使使用子程序也无所谓!
小结:当在程序中须不断重复使用某一节段时才使用子程序,在使用子程序时请将变量定义在子程序中。
8、使用 Include File 对性能的影响
我们将部分的程序段放进 Inc1.asp 中,然后再将他 Include 进来,看会有什么影响。
<% OPTION EXPLICIT
Dim FirstName
…
Dim BirthDate
FirstName = "Kuku"
…
BirthDate = "1/1/1950"
%>
<!-- #include file="inc1.asp" -->
基准值 = 5.57 msec,测试结果 = 5.93 msec,速度减低 0.36 msec,整体性能下降 6.5%,影响挺严重的,如果我们把子程序放到 Inc1.asp 中,再将他 Include 进来,然后在主程序中调用 Inc1.asp中的子程序看看会有什么结果:
<% OPTION EXPLICIT
Dim FirstName
…
Dim BirthDate
FirstName = "Kuku"
…
BirthDate = "1/1/1950"
CALL writeTable()
%>
<!-- #include file="inc1.asp" -->
基准值 = 5.57 msec,测试结果 = 6.08 msec,速度减低 0.51 msec,整体性能下降 9.2%,性能又比之前的差了一些。
小结:除非有多个档案要分享同一个程序,否则尽量不要使用 Include。
9、当使用错误控制 (On Error Resume Next)对整体性能的影响
<% OPTION EXPLICIT
On Error Resume Next
Dim FirstName
.........
%>
基准值 = 5.57 msec,测试结果 = 5.67 msec,速度减低 0.10 msec,整体性能下降 1.0%,使用错误控制的确要代价的。
小结:除非你是使用 COM 对象来存取系统资源或是使用到 FileSystem 对象,否则所有的错误都是可以控制的,也就是说没有必要使用到错误控制时就不要使用。
<%@ TRANSACTION = REQUIRED %>
<% OPTION EXPLICIT
Dim FirstName
…
10、针对SQL 的"需要异动请求"<%@ TRANSACTION = REQUIRED %>的影响
针对大型数据库系统,例如 SQL 的 MSDTC,若是在程序开头加上<%@ TRANSACTION = REQUIRED %> 会对系统造成什么影响呢?由于采用的程序太长,所以我就不列出了,仅列出测试的结果:
基准值 = 5.57 msec,测试结果 = 13.39 msec,速度减低 7.82 msec,整体性能下降 140.4%,这个影响太严重了,那么应如何避免呢?
小结:只有当多个执行绪要求同一个异动结果时才使用 TRANSACTION。