怎样最大限度地发挥ASP的性能

一天到晚冲浪的鱼
作者:David M. Williams
曾经看到一件T恤衫上写着:"不管问题是什么 - 解决问题最重要!
"。在计算机世界中也是如此. 不管我们是否正在运行最新的千兆赫
处理器, 我们总是能用更多的随机存储器(RAM)或磁盘空间进行工作,
或者用另一个处理器, 或者用更快的以太网连接,或者用其它方式来
更好地解决问题。
运行网络应用程序更是如此。如果一个急躁的用户单击键盘而运行结
果却姗姗来迟时,这位用户就可能寻求其它解决方案。这种情况如果
在企业运营方面发生,就意味着销售额的潜在损失。
我们可能无法解决对用户带宽的限制,但我们完全可以通过努力使我
们的ASP站点最优化从而实现系统以最佳状况运行。
相关因素
影响ASP性能的因素有许多,例如:
可用带宽
服务器性能(处理器速度, 随机存储器)
运行在服务器上的其他操作(如OpenGL屏幕保护程序)
数据库连接模式, 连接存储区, 数据库本身(如 Oracle, SQL
Server和 Access数据库)
使用的语言(对于某些功能,我听说 Perlscript 优于 VBScript)
储存的程序 - 在线 SQL
使用 COM 对象, 而不是 ASP语言
好的编码方法
这些只是列出的一些因素。我们也可以调整网络服务器以得到"最佳"
性能,这种艺术包含有很多的变量。
上述因素中有一些可能是常识,但是另一些因素可能本身就是非常复
杂的问题。如何解决?本文将列举一些影响ASP网页性能的主要因
素。 尽管结果仅是节约了几个毫秒的工作时间,但它们却能有效地
用于我们的所有站点, 不管它是庞大复杂的或是低级简单的, 也不管
我们是否是 Web 技术巨擘还是 ASP 的初学者。
ASP程序语句的大小
您的程序语句页面(及其他页面)长吗?这个问题从一开始就影响着
您。ASP程序对于收集信息和输出格式化来说确实非常有用;不过,
程序是一行一行解释的, 程序越长执行的时间也越长。
如果您的ASP程序过长怎么办?在这里建议如下:
把它转换成服务器方的组件。这是正确的,用任何现代的 Windows
编程语言创建Visual Basic DLL,或者ActiveX组件,并注册到服务器
上。在
www.webdevelopersjournal.com/articles/activex_for_asp.html
中可找到创建Visual Basic DLL或ActiveX组件的快速指导。由于已
在服务器中注册,ActiveX组件不仅递送的速度更快, 它还对您的软
件提供更佳的保护, 尤其是如果您把您的ASP站点由第三方的服务器
托管时更是如此。
将脚本分割成为截然不同的用户,逻辑和数据服务。最后,必需问你
的语句为什么这样长?
您的程序确实需要这样长吗?很有可能,程序中有访问数据源的部
分,有管理用户输入和输出的格式化部分, 和执行企业商业准则的应
用程序。很可能您可以将这些程序分割成为较小的模块,以区分这些
截然不同的功能。实际上,如果您这样做,你甚至可以发现一些重复
的代码:例如, 如果你递交几个表, 您可以只写一个制表的通用函数
, 只是调用此通用函数几次。
与ASP程序大小问题相关的是 #include 的大小。当您包含
#include)一个文件时, 整个文件被装入, 就好象它整个存在于包含
它的 ASP 文件中一样。这样,如果你有一个冗长的 #include文件包
含了各种全局方法和定义,应知道这些全局方法和定义要装入到每个
#include中, 不管您是否需要其中的哪一个。ASP把完全的展开的代
码隐藏起来,当调用一个方法时,这可能使查找的效率降低。在这种
情况下,#include文件必须拆开成较小的模块文件。如果你的语句很
长, 请一定使用Response.IsClientConnected。这意味着如果客户端
不再连接, 您的中央处理器就能避免无效循环。
ASP 和 HTML 的布置
每个人都做此项工作, 在提交表格时在ASP和HTML之间转换。例如,
< table>
< tr>< td>Name< /td>< td>Number< /td>< td>Department< /td><
/tr>
< tr>< td>
< %=RS("Name")%>
< /td>< td>
< %=RS("Number")%>
< /td>< td>
< %=RS("Department")%>
< /td>
另一个常见的例子是使用 if 条件语句,
< %
If not Session("DBOpen") then
%>
< h1>Database not connected< /h1>
< %
Else
%>
< h1>Database open< /h1>
< %
End If
%>
在这两个例子中,通过将 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
%>
这样做能真正地显示显著的性能改善。
会话状态
毫无疑问,在ASP中可以维持会话状态的能力是一个重要的特点。不
过,它确实要影响到您的性能。显然, 因为会话被限制在单一的服务
器上,所以您的 Web 站点的可升级性将成为问题。然而,会话的确
要消耗每个用户的资源。
如果您不使用会话变量(并且实际上你可以不需要使用它),有时使用
隐藏形式字段或查询字符串也可以达到目的, 那麽您应禁用会话状
态。你能用以下声明禁用会话状态,
@EnableSessionState = False
于是 ASP 将不检查会话信息。
如果您确实要依靠会话状态, 应避免将大量数据放入会话对象。IIS
里的会话是持久不变的,在会话终止或超时之前分配给会话的内存不
会释放。因此, 如果你的应用程序被很多的并列用户使用,你的资源
将被耗尽。
数据库访问
访问数据库将减慢 ASP 应用程序,尽管在这方面的性能受损是值得
的。这是由于将数据库连接到 Web应用程序使我们获得了很多利益。
因此,由于连接和查询数据库时我们已经容纳了性能损失,我们必须
确保尽可能降低这种性能损失。
确保对您的数据库编制索引,因为这可立即改进应用程序的性能。另
外,在数据库服务器上一定要运行"更新统计"程序以帮助服务器跟踪
数据分布。然后,你的数据库可以进行更改以根据此信息查询执行计
划。在可能的地方, 利用储备的程序, 而不是 SQL 查询, 因为这些
查询必须重复编辑。
检查 SQL 语句,确保在查询级别过滤数据,而不要返回多于需要的
数据,再在 ASP 中过滤这些数据。绝大部分的人都知道 SQL
'where' 子句,但是我认为在使用集合功能时 'having' 子句经常被
忽略掉。最后,让SQL做它计划要做的工作,让它联合、分类、编组
和过滤数据。
如果能够使用 SQL 服务器,不要使用 Access。SQL服务器是公司的
最佳选择。Access 仅仅是基于文件的数据库,不能很好地处理多个
用户。
在有条件时使用OLEDB 和DSN 连接,因为这些连接在处理多个并列连
接时已证明性能最佳。
不要使用DAO 或 RDO,因为这些对象主要是用于单客户应用程序操作
的。ADO则 是为 Web 应用专门设计的。
在创建记录集时明确设置光标和锁定类型。光标确定记录集如何对当
前运行的数据集进行更新,锁定类型确定记录集将如何执行更新。了
解并用不同的组合进行试验以查看数据库性能如何变化。如果只想单
向传送数据,那么缺省光标(仅转发,只读)给出最快的性能,耗用
最小。

去爱