精彩专题推荐:建站之入门课 建站之必修课 建站之关键课 网站价值所在 流量提高专题 css+div 标准 个人网站打造全过程
返回建站学首页
导航:
建站首页 | 网站设计 | 网站开发 | 网站运营 | 网页软件 | 建站指南 | 搜索优化 | 图像处理 | 视频教程 | 书籍教程 | 建站专题
当前位置:首页>网站开发>ASP教程>正文

ASP编程中的误区


来源:我要学习网 时间:06-11-13 点击: 点击这里收藏本文
相信现在很多朋友正在学习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。    

  把此文章收藏到:          
广而告之
文章搜索
  • Google JZxue.Com

关于我们 | 联系我们 | 友情链接 | 网站地图
Copyright © 2005 - 2006 建站学 All rights reserved.