asp

位置:IT落伍者 >> asp >> 浏览文章

改进性能和样式的 24个 ASP 技巧(2)


发布日期:2020年11月23日
 
改进性能和样式的 24个 ASP 技巧(2)

技巧 晚点获取资源早点释放资源

这是个小技巧通常最好晚点获取资源而要早点释放资源这些资源包括 COM 对象文件句柄和其他资源

ADO 连接和记录集是这种优化的首要目标当您使用完记录集就是说用它的数据打印完一个表格后请立即将它释放而不是等到页的末尾将您的 VBScript 变量设置为

Nothing

是最好的做法不要让记录集简单地脱离作用域同时应当释放任何有关的 Command 或 Connection 对象(不要忘了对记录集或连接调用

Close()

在将它们设置为

= Nothing

之前)这将缩短数据库必须为您调整资源的时间跨度并将数据库连接尽可能快地释放给连接池

技巧 进程外的执行将牺牲可靠性

ASP 和 MTS/COM+ 都有允许您以可靠性换取性能的配置选项当建立和部署应用程序时应当理解这种交换

ASP 选项

ASP 应用程序可以配置为以三种方式之一运行在 IIS 中引入了术语隔离级来描述这些选项三个隔离级值分别是低中和高

低级隔离该隔离级在所有版本的 IIS 中受到支持并且是最快的它在主 IIS 进程 Inetinfoexe 中执行 ASP如果 ASP 应用程序崩溃则 IIS 也将崩溃(要在 IIS 下重新启动 IISWeb 站点管理员需要使用工具如 InetMon来监视站点如果服务器失败将运行批处理文件来重新启动服务器而 IIS 则引入了可靠的重新启动它将自动重新启动失败的服务器

中级隔离IIS 引入了这个新隔离级它称为进程外的这是因为 ASP 运行在 IIS 进程之外在中级隔离中所有被配置按中级运行的 ASP 应用程序将共享单个进程空间这将减少在一个服务器上运行多个进程外的 ASP 应用程序所需的进程数中级是 IIS 中默认的隔离级

高级隔离在 IIS 和 IIS 中受到支持高级隔离也是进程外的如果 ASP 崩溃则 Web 服务器并不崩溃ASP 应用程序将在下一个 ASP 请求时自动重新启动使用高级隔离每个被配置为按高级运行的 ASP 应用程序将在其自己的进程空间中运行这样可以保护 ASP 应用程序彼此不受干扰它的缺点是它需要为每个 ASP 应用程序建立独立的进程当需要在一个服务器上主持十多个应用程序时会增加很多开销

那么哪个选项是最好的呢?在 IIS 运行进程外的应用程序会极大地影响性能在 IIS 做了许多工作使得进程外运行 ASP 应用程序对性能产生的影响降到了最低实际上在大多数测试中在 IIS 中的 ASP 进程外应用程序要比 IIS 中的进程内应用程序运行得更快无论如何进程内(低隔离级)在两种平台上仍然产生了最好的性能但是如果您的命中率相对较低或最大吞吐量较低选择低隔离级不会有太大的好处所以除非您需要每个 Web 服务器每秒处理数百或数千个页面否则没有必要选择低隔离级同样应当测试多种配置并判断哪种情形最适合您

注意 当您进程外运行 ASP 应用程序(中级或高级隔离)时则在 NT 上它们将运行在 MTS 中而在 Windows 上它们将运行在 COM+ 中在 NT 上它们运行在 Mtxexe 中而在 Windows 上它们运行在 DllHostexe 中任务管理器您可以看见这些正在运行的进程还可以看见 IIS 如何为进程外的 ASP 应用程序配置 MTS 程序包或 COM+ 应用程序

COM 选项

COM 组件也有三个配置选项虽然与 ASP 选项不完全相似COM 组件可以被不配置配置为库应用程序或配置为服务器应用程序不配置是指不向 COM+ 注册组件组件将运行在调用者的进程空间就是说它们是进程中库应用程序也是进程中的但受惠于 COM+ 的服务包括安全性事务和环境支持服务器应用程序被配置为在其自己的进程空间中运行

您可能看到不配置的组件比库应用程序优点稍微多些您还可能看到库应用程序服务器应用程序有很大的性能优点这是因为库应用程序与 ASP 运行在同一个进程中服务器应用程序则运行在自己的进程中内部进程调用的开销要比进程内调用的开销大得多而且当在进程之间传递数据(如记录集)时必须在两个进程之间复制所有的数据

缺点!当使用COM 服务器应用程序如果要在 ASP 和 COM 之间传递对象请确保对象实现按值汇集即 MBV实现 MBV 的对象将其自身从一个进程复制到另一个进程这比另一种方式好在另一种方式中对象留在创建它的进程中而其他进程则重复调用创建使用该对象的进程被断开连接的 ADO 记录集将是按值汇集的已连接的记录集则不是ScriptingDictionary 并不实现 MBV不会在进程之间传递最后要另外告诉 VB 程序员的是MBV 不是通过传递参数

ByVal

获得的MBV 是由原始组件创作者实现的

怎么办?

如果您想要以性能与可靠性的合理交换来完成您的配置我们的推荐如下

在 IIS 使用 ASP 的低隔离级别并使用MTS 服务器包

在 IIS 使用 ASP 的中隔离级别并使用COM+ 库应用程序

这些是很一般的准则通常让公司以中或高隔离级别运行 ASP而单一目的的 Web 服务器可运行于低隔离级别请权衡折中并自行决定满足需求的配置

技巧 显式使用选项

asp 文件中显式使用

选项 Explicit

置于 asp 文件开头的这一指令强制开发人员声明所有要使用的变量许多开发人员认为这有助于调试应用程序因为它避免了错误键入变量名称而不经意地新建变量(例如

MyXLMString=

而非

MyXMLString=)

也许更重要的是声明的变量比未声明的变量快实际上脚本运行时在每次使用未声明变量时按照名称引用而声明的变量在编译或运行时分配了序号这样声明的变量按照该序号引用由于

选项 Explicit

强制变量声明因此保证声明了所有变量而实现快速访问

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

局部变量是在子例程和函数中声明的变量在子例程和函数中局部变量访问要快于全局变量访问使用局部变量还可以使代码更加清晰因此尽可能使用局部变量

技巧 将常用数据复制到脚本变量

在 ASP 中访问 COM 时应该将常用的对象数据复制到脚本变量中这将削减 COM 方法的调用COM 方法的调用与访问脚本变量相比要相对昂贵些在访问 Collection 和 Dictionary 对象时这一技术也可以削减了昂贵的查找

通常如果打算多次访问对象数据请将数据放入脚本变量该优化的主要目标是 Request 变量(Form 和 QueryString 变量)例如您的站点可能传递一个名为 UserID 的 QueryString假定该 UserID 变量要在特定页中引用 请不要调用

Request(UserID)

而在 ASP 页的开头将 UserID 赋予某个变量然后就在页中使用该变量这将节省 次 COM 方法调用

在实际中访问 COM 属性或方法暗藏着繁复的过程和大量的开销下面是一个示例它只是些相当普通的代码(从语法上讲)

Foobarblahbaz = Foobarblahqaz()

If Foobarblahzaq = Foobarblahabc Then

在运行这段代码时将发生下列事件

变量

Foo

被解析为全局变量

变量

bar

被解析为

Foo

的成员这将产生 COM 方法调用

变量

blah

被解析为

Foobar

的成员这也将产生 COM 方法调用

变量

qaz

被解析为

foobarblah

的成员是的这也将产生 COM 方法调用

调用

Foobarblahquaz()

又一次产生 COM 方法调用理解这幅图了吗?

执行步骤 将再次解析

baz

系统不知道调用

qaz

是否更改对象模型因此步骤 必须再次执行解析

baz

baz

解析为

Foobarblah

的成员进行属性置入

再次执行步骤 并解析

zaq

再次执行步骤 并解析

abc

正如所见这是非常可怕的低效率(而且非常慢)用 VBScript 编写该代码实现的快速方法为

Set myobj = Foobarblah 对 blah 做一次解析

Myobjbaz = myobjqaz()

If Myobjzaq = Myobjabc Then

如果您使用的是 VBScript 或更高版本则可用

With

语句来写这段代码

With Foobarblah

baz = qaz()

If zaq = abc Then

End With

请注意该技巧对 VB 编程同样有效

技巧 避免重新定义数组

尽量避免

Redim

数组从关心性能的角度来说如果计算机受物理内存的限制最好一开始将数组的维数设置为最差方案 而不要将维数设置为最佳方案再根据需要重新定义维数这并不意味着明知道不需要那么多而就是应该分配太多的内存

下面代码展示了您没有必要地使用了

Dim

Redim

来解决

<%

Dim MyArray()

Redim MyArray()

MyArray() = hello

MyArray() = goodbye

上一篇:ASP 规则指南

下一篇:使用ASP加密算法加密你的数据