1.讨论主题:ASP脚本大小
你的脚本页(还有其它页面)是不是比必须的长度要长?
这是一开始执行就会降低Asp性能的东西。ASP脚本在用来获取信息和格式化输出的时候是十分有用的,但脚本也是逐行解释执行,所以你的脚本越长,执行它的时间也就越长。
如果你的脚本很庞大,怎么做才能减少脚本的长度呢?
这里有几点建议:
你可以将它们转换成服务器端组件,也就是说,做成VB动态链接库DLL或者通过先进的Windows编程语言或适当的COM接口语言将它转换成未编译组件?并且在服务器端注册它们。有关的快速指南可以在找到。对一个写得好的ActiveX组件进行编译不但能大幅度提高性能,还可以保护你的软件(脚本),尤其当你将你的Asp站点发布在第三方主机上的时候。
因为脚本是逐行解释执行的,所以剔除多余的脚本或建立更高效率的脚本能够改进性能。如果你在单个Asp文件中有数百行的代码,可能这样做你能很好地划分使用者,买卖和数据服务。事实上,如果你这样做,可能会找出一些冗余的代码:如果你需要输出几个表格,你可以编写一个通用函数来输出一个表格,只是多次调用它。
在讲述Asp脚本的大小问题的时候,不得不提及包含文件的大小。当你使用一个包含文件的时候,整个包含文件被装入,当包含文件被包含的时候,相当于在Asp文件本身写下那部分代码。因此,如果你在一个冗长的包含文件里定义了很多通用的方法和定义,要明白到在你包含该文件的时候,不管你要不要用到里面的每个方法和定义,它都是被整个装入的。ASP缓存全部的展开代码,这会降低查找效率在这种情况下,包含文件必须被分割成更小的,模块化的文件。也要明白到包含文件被服务器视为单独的页面请求,使用太多的包含文件会影响下载时间。
<!--#includefile="Header.asp"-->
<!--#includefile="Footer.asp"-->
<SCRIPTlanguage="vbscript"runat="server">
SubMain()
WriteHeader
WriteBody
WriteFooter
EndSub
SubWriteBody()
...
EndSub
Main'调用过程Main
</SCRIPT>
假如你的脚本冗长的话,请使用Response.IsClientConnected。这意味着在客户端不再连接到服务
器的时候,你的服务器CPU能避免循环等待。
<%
'检查客户端是否仍在连接
IfNotResponse.IsClientConnectedThen
'仍然连接着,处理程序
Else
'断开
EndIf
%>
使用快速的OLEDBProvider技术连接你的数据库而不是使用DSN连接。不再需要恳求你的ISP(或数据库管理员/网管)为你建立一个系统DSN,当你移走Web文件的时候,亦不需要改变配置。
OLEDB介于ODBC层和应用程序之间。在你的ASP页面中,ADO介于ODEDB之上的“应用程序”。你的ADO调用首先被送到OLEDB,接着被送到ODBC层。然而,你可以直接连接到OLEDB层,并且如果你这样做的话,你就能看到服务器端性能的提高。
然而,怎样直接连接到OLEDB?
如果你使用SQLServer7,使用下面的连接代码连接数据库:
strConnString="DSN='';DRIVER={SQLSERVER};"&_
"UID=myuid;PWD=mypwd;"&_
"DATABASE=MyDb;SERVER=MyServer;"
最重要的参数是DRIVER=部分。如果你要绕过ODBC而使用通过使用OLEDB连接SQLServer(这是更快
的连接),请使用下面的语法:
strConnString="Provider=SQLOLEDB.1;Password=mypassword;"&_
"PersistSecurityInfo=True;UserID=myuid;"&_
"InitialCatalog=mydbname;"&_
"DataSource=myserver;ConnectTimeout=15"
有什么不对的地方吗?
现在你可能会觉得有点奇怪:我们在这个新的连接方法中的要点是什么呢?为什么不使用标准DSN-less/SystemDSN途径?呵,根据Wrox在他的著作《ADO2.0Programmer'sReference》中测试的结果表明,如果你使用OLEDB连接和DSN或者DSN-less连接方法比较,你会发现有下面的改进:
性能对比:
SQLAccess
OLEDBDSNOLEDBDSN
连接时间:1882连接时间:6299
查询1,000条记录时间:29005400查询1,000条记录时间:100950
注释:这个结果在Wrox的《ADO2.0Programmer'sReference》一书的第232和233页可以查到。时间的单位是毫秒,查询1,000记录时间是通过服务器端游标计算出来的(当使用客户端游标的时候,OLEDB与DSN记录集的性能之间的差别不大)。