Active Server Pages可以让动态页面很快地执行,但是,在代码中和数据库的连接上加入一些技巧,就能让程序更快地执行。这是一篇关于如何精制脚本程序以及ASP特征来达到最大速度的文章。任何在用户点击按钮到在屏幕上出现结果间延迟都会让用户茫然,对于一个商业站点,这就意味着潜在的用户损失。
ASP脚本的尺寸
我们也许不能控制用户的带宽,但是通过优化ASP站点,我们的确能够使应用达到最佳性能。许多潜在的性能收获可以通过系统调整,而不是改变代码。
因素
首先,有哪些因素可能影响ASP程序的性能?很不幸,有许多吗?这里仅仅是一些:
有限的带宽
服务器端的处理器和其他硬件的速度
在服务器上运行的其他进程(比如那些OpenGL屏幕保护程序中的一个)
数据库连接模式,连接池,或者单独的数据库(比如Oracle、SQLServer、Access)
使用的语言
存储过程和SQL
使用未编译组件,而不是VB或者JavsScript的ASP
良好的编程习惯,比如对错误的处理
对于一个有经验的具备良好IIS知识的开发者来说,以上一些特征是很平常的,但是另外一些可能非常复杂。在这篇文章中,让我们来研究一下如何做才能节省毫秒级别的时间,而不是试图面面俱到。
你的ASP脚本程序对于实现的功能是否显得过长?这就会从开始影响程序的性能。对于收集信息和格式化输出,ASP脚本是非常有用的,但是脚本是按照行来解释执行的,所以代码越长,执行时间越长。
如果有一个很长的ASP脚本程序,怎么样才能减少长度呢?这里有一些建议。
你可以将它们转换为服务器端组件,换言之,就是创建一个Visual Basic DLL文件,或者使用任何现代的Windows 程序语言和COM兼容语言来建立一个未编译组件,并且在服务器上注册。关于这个功能的教程请参阅http://www.webdevelopersjournal.com/articles/activex_for_asp.html。一个编写很好的ActiveX组件不仅能大幅度提高速度,而且,它还能大大地提高你的软件的保护程度,特别是你为第3方开发ASP程序时。
因为脚本是一行行解释执行的,所以排除多余的脚本或者建立有效率的脚本,就能提高程序性能。如果在一个单一页面中有成百行的ASP脚本,你就可能很好地将程序分割成用户、商业和数据服务部分。实际上,如果这么做了,你就会发现一些多余的代码。比如,如果需要显示几个表格,就可以编写一个通用的表格显示函数,这样,在需要的地方调用就可以了。
与尺寸相关的另外一个问题就是包含文件的长度。当执行一个#include文件时,整个文件都被调入,就象在被包含的文件中存在一样。所以,如果有一个甬余的包含文件,其中包含了许多全局方法和变量定义,那么就请注意它们将被调入每一个包含它们的文件中,而不管是否可用。ASP缓存了所有的扩展代码,导致了效率低下的搜索。在这种情况下,包含文件必须变小。尽管包含文件被服务器处理为单独的请求,但是过多的使用#include,就会导致下载时间的过度增加。
< !-- #include file="Header.asp" -->
< !-- #include file="Footer.asp" -- >
< SCRIPT language="vbscript" runat="server" >
Sub Main()
WriteHeader
WriteBody
WriteFooter
End Sub
Sub WriteBody()
...
End Sub
Main 'call sub Main
< /SCRIPT >
如果脚本很长,注意要使用 Response.IsClientConnected 命令,这将避免因客户端不再连接时CPU浪费运行循环。
< %
'check to see if the client is connected
If Not Response.IsClientConnected Then
'still connected so proceed
Else
'disconnected
End If
% >
分散ASP代码和HTML语言命令
有人这么做吗?当描述表格时,在ASP和HTML进行切换,比如:
< HTML >
< BODY >
< %
Set MyConn = Server.CreateObject("ADODB.Connection")
MdbFilePath = Server.MapPath("sample.mdb")
MyConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MdbFilePath & ";"
SQL_query = "SELECT * FROM Friends"
Set RS = MyConn.Execute(SQL_query)
WHILE NOT RS.EOF
% >
< LI >< %=RS("Name")% >: < A HREF="< %=RS("Link")% >" >Homepage< /A >
< %
RS.MoveNext
WEND
% >
< /BODY >
< /HTML >
另外一个例子是使用If命令:
< %
If Not Session("DBOpen") Then
% >
< H1 >Database not connected< /H1 >
< %
Else
% >
< H1 >Database open< /H1 >
< %
End If
% >
在以上2个例子中,脚本性能能通过保持ASP程序块在服务器端以及使用Response.Write来产生HTML代码来提高性能,就象下面一样:
< %
If not Session ("DBOpen") Then
Response.Write "< H1 >Database not connected< /H1 >"
Else
Response.Write "< H1 >Database open< /H1 >"
End If
% >
对于大且长的脚本,你可以通过上面的方法看到明显的性能提高。
会话状态
毋庸置疑,通过session在ASP中保持状态是一个非常重要的特征。然而,这将影响程序的性能。很明显,服务器的伸缩性因为session仅仅能局限于单一服务器而变成一个问题,一个session为每一个用户都要消耗资源。
如果不使用session变量,而且实际上也可能不需要,因为使用隐藏表单域、在数据库中存储数值以及使用查询字符串可以完成session的功能,这时,就应该屏蔽session状态,代码如下:
@EnableSessionState = False
这样,ASP就将不再检查session信息。
如果确实要依靠session状态,那么请避免在session对象中存放大量的数据。如果设置了客户端的HTTP Cookies,那么IIS中的Session是生效的,并且直到session被中止或者到期,为每一个session分配的内存空间将一直保留。由于这个原因,当有许多并发用户访问站点时,资源将会很快耗尽。
……