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分配的内存空间将一直保留。由于这个原因,当有许多并发用户访问站点时,资源将会很快耗尽。
|