设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > Asp教程 > 正文

二十八条改善ASP性能和外观的技巧目录 引言 技巧 1:将经常使用(6)

发布时间:2020-12-24 18:33 所属栏目:120 来源:网络整理
导读:COM 组件也有三种配置选项,虽然与 ASP 选项不完全类似。COM 组件可以是“未配置的”、配置为库应用程序或配置为服务器应用程序。“未配置的”意思是指组件没有注册 COM+。组件将在调用程序的进程空间运行,那就是

COM 组件也有三种配置选项,虽然与 ASP 选项不完全类似。COM 组件可以是“未配置的”、配置为库应用程序或配置为服务器应用程序。“未配置的”意思是指组件没有注册 COM+。组件将在调用程序的进程空间运行,那就是说,它们是“进程内的”。库应用程序也是进程内的,但使用 COM+ 的服务,包括安全、事务和上下文支持。服务器应用程序被配置为在它们自有的进程空间内运行。

您可以看到未配置的组件比库应用程序略有一些优势。库应用程序比服务器应用程序的性能优点更大。这是因为库应用程序与 ASP 在同一进程内运行,而服务器应用程序在它们的自有进程内运行。进程间的调用比进程内调用开销更大。而且,当在进程之间传递诸如记录集之类的数据时,必须在两个进程之间复制所有的数据。

陷阱!当使用 COM 服务器应用程序时,如果您在 ASP 和 COM 之间传递对象,要确保对象执行“按值汇集”或 MBV。执行 MBV 的对象将它们自己从一个进程复制到另一个进程。这比下面一种方法好,采用这种方法时,对象仍在创建者的进程中,另外一个进程反复地调用创建进程以使用该对象。切断连接的 ADO 记录集将“按值汇集”,连接的记录集则不然。Scripting.Dictionary 不执行 MBV,且不在进程之间传递。最后,VB 程序员请注意:MBV 不通过传递参数 ByVal 获得。MBV 由原始的组件作者执行。

怎么办?

如果让我们建议一个兼顾性能与可靠性的合理配置,它们应是如下的配置:

  • 在 IIS 4.0 中,使用 ASP 隔离级别,使用 MTS 服务器程序包。
  • 在 IIS 5.0 上,使用 ASP 的隔离级,并使用 COM+ 库应用程序。

这些是非常一般的原则,主机服务公司一般情况下以隔离级运行 ASP,而单用途的 Web 服务器可以以隔离级运行。衡量各种利弊,并自己决定哪个配置更能符合您的需要。

技巧 10:使用显式选项

在 .asp 文件中应使用 Option Explicit。此指令放在 .asp 文件的最上面,它强制开发人员声明要使用到的所有变量。许多程序员认为这种方法对于调试应用程序很有帮助,因为这种方法避免了键错变量名和误建新变量的可能性(例如,将 MyXMLString=) 错写成 MyXLMString=...

更重要的一点也许是,声明的变量比未声明的变量速度更快。由此,脚本在运行时每次用到未声明的变量时,按名称引用它。另一方面,声明的变量是有顺序的,要么以编译时间,要么以运行时间。以后,声明的变量都按此顺序引用。因为 Option Explicit 强制变量声明,它能确保声明所有变量,因此访问的速度也很快。

技巧 11:在子例程和函数中使用局部变量

局部变量是那些在子例程和函数内声明的变量。在函数或子例程内,局部变量访问比全局变量访问更快。局部变量的使用也会使代码更清晰,因此应尽量使用局部变量。

技巧 12:将经常使用的数据复制到脚本变量中

当访问 ASP 中的 COM 对象时,应将经常使用的对象数据复制到脚本变量中。这样做可减少 COM 方法调用,因为 COM 方法调用与访问脚本变量相比,开销相对较大。当访问 CollectionDictionary 对象时,这种技术也会减少开销很大的查找。

一般来说,如果您打算不止一次访问对象数据,那么就应将数据放到脚本变量中。这种优化的主要目标是 Request 变量(Form 和 QueryString 变量)。例如,您的站点可传递一个名为 UserID 的 QueryString 变量。假设此 UserID 在特定页面上被引用 12 次。可以无须调用 Request(?UserID?) 12 次,而是在 ASP 页面最上面将 UserID 指派到一个变量。然后在该页面自始至终使用该变量。这样就省去了 11 次 COM 方法调用。

实际上,访问 COM 属性或方法的开销并没有那么大。下面举一个例子,说明某相当常见的代码(从语法上讲):

Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...

当此代码运行时,下面是发生的情况:

  1. 变量 Foo 被解析为全局对象。
  2. 变量 bar 被解析为 Foo 的成员。这实际就是一次 COM 方法调用。
  3. 变量 blah 被解析为 Foo.bar 的成员。这又是一次 COM 方法调用。
  4. 变量 qaz 被解析为 foo.bar.blah 的成员。没有错,这还是一次 COM 方法调用。
  5. 调用 Foo.bar.blah.quaz(1)。再一次 COM 方法调用。懂了吗?
  6. 再次执行步骤 1 至步骤 3 以解析 baz。系统并不知道调用 qaz 是否改变对象模型,因此必须再次执行步骤 1 至 3 以解析 baz
  7. baz 解析为 Foo.bar.blah 的成员。赋予属性。
  8. 再次执行步骤 1 至步骤 3 以解析 zaq
  9. 再次执行步骤 1 至步骤 3 以解析 abc

正如您可看到的,效率相当差(且慢)。以 VBScript 写此代码的快速方法是:

Set myobj = Foo.bar.blah ' do the resolution of blah ONCE
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...

如果您使用 VBScript 5.0 或更高版本,您可以使用 With 语句写此代码:

With Foo.bar.blah
.baz = .qaz(1)
If .zaq = .abc Then '...
...
End With

注意此技巧也适用于 VB 程序设计。

技巧 13:避免重新确定数组的维数

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读