您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> asp >> 正文

微软建议的ASP性能优化28条守则

作者:作者:未…    信息学院来源:网络收集    点击数:    更新时间:2006-8-27 我要参与讨论

  .0 中,做了许多改进,将进程外运行 ASP 应用程序所产生的开销降到最低限度。事实上,在绝大多数测试中,IIS 5.0 中的 ASP 进程外应用程序比 IIS 4.0 中的进程内应用程序运行得更快。不管怎样,在两个平台上,进程内(低隔离级)性能最佳。但是,如果访问率相对较低或最大吞吐量较低,低隔离级的优势不太明显。因此,在您每一 Web 服务器每秒钟需要数百或成千上万页面时,才会觉得有必要设置低隔离级。与往常一样,应对多种配置进行测试,确定您要采取哪一种折衷方案。

注意 当您运行 ASP 进程外应用程序时(中级或高级隔离),它们在 NT4 中的 MTS 和在 Windows 2000 中的 COM+ 中运行。即,在 NT4 中它们在 Mtx.exe 中运行;而在 Windows 2000 中,它们在 DllHost.exe 中运行。您可以在任务管理器中看到这些进程在运行。您还可以看到 IIS 如何为进程外 ASP 应用程序配置 MTS 程序包或 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 方法调用与访问脚本变量相比,开销相对较大。当访问 Collection 和 Dictionary 对象时,这种技术也会减少开销很大的查找。

一般来说,如果您打算不止一次访问对象数据,那么就应将数据放到脚本变量中。这种优化的主要目标是 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 ' ...


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

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

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

在google里搜索更多微软建议的ASP性能优化28条守则

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

供求信息




| 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明