日期:2010-04-22  浏览次数:20979 次

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

  当访问ASP中的COM对象时,应该将常用对象数据复制到脚本变量中。着将减少COM方法调用。而COM方法调用代价相对比访问脚本数据更高。当访问Collection和 
Dictonary对象时,这项技术也能消减高昂的查询代价。 

  通常,当准备不止一次访问一个对象数据时,应该将这个数据放当一个脚本对象中。

  这项优化的主要目标是Request变量(Form和QueryString变量)。例如,你的站点传递一个叫UserID的QueryString变量,假定在一个特定页UserID被引用十次。在ASP页面的顶部,将UserID的值赋给一个变量,来替代十次的调用Request 
("UserID"),将接生9次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. 变量blash被解析为Foo.bar的一个成员。同样,这也触发一次COM方法调用 
4. 变量qaz被解析为Foo.bar.blash的一个成员。对,这也触发一次COM方法调用 
5. 调用 Foo.bar.blah.qaz(1)。一个或多个COM方法调用。获取图片? 
6. 重复步骤1到步骤3来解析baz。系统不知道调用qaz是否会改变对象模型,所以步骤1到步骤3又执行了一次,来解析baz 
7. 解析出baz是Foo.bar.blah的一个成员,执行属性put. 
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 

  技巧13:避免使用可变数组 

  尽量避免使用可变数组。既然关心性能,最好还是在数组初始化的时候就设置好它可能的最大大小。当然,这不是说你明知不需要几M的内存,但还是应该给数组分配了那么多。 

  下面的代码是一个无理使用Redim的示范: 

<% 
Dim MyArray() 
Redim MyArray(2) 
MyArray(0) = "hello" 
MyArray(1) = "good-bye" 
MyArray(2) = "farewell" 
... 
Redim Preserve MyArray(5) 
MyArray(3) = "more stuff" 
MyArray(4) = "even more stuff" 
MyArray(5) = "yet more stuff" 
%> 

  简单地将数组初始化的时候定义成正确的大小(这里应该是5)远比Redim数组使它变大好。你可能会浪费一些内存(如果你最后没有用完所有的元素),但得到的是速度!

  技巧14:使用响应缓冲(Response Buffering) 

  打开“响应缓冲”就可以缓冲整个页面的输出,这样可以减少向浏览器写的次数,提高了总体性能。每次写浏览器都要耗费一定的时间和资源,因此减少写浏览器次数能提高性能;同时,TCP/IP协议发送少的大块数据比发送多的小块数据效率更高。 

  有两种方法可以打开响应缓冲。首先,可以使用Internet Service Manager来打开整个应用的响应缓冲。这是推荐的方法。在IIS 4.0和IIS 5.0中,新建一个应用时,响应缓冲缺省是打开的。第二种方法:针对每个独立的ASP页面,可以通过在页面顶部放置如下代码来打开响应缓冲: 

<% Response.Buffer = True %> 

  这行语句必须在所有缓冲数据写之前执行(就是说,在所有HTML和通过Response.Cookies设置Cookie之前)。通常,最好是为整个应用打开响应缓冲;这样你就不用在每个ASP页面顶部写上面那条语句了。 

Response.Flush 

  对于响应缓冲,因为用户在看到东西之前必须等待整个页面生成,所以用户可能够感觉到ASP页面响应比较慢(虽然整体响应时间缩短了);对一个运行时间较长的页面,可以同过Response.Buffer = False 来关掉响应缓冲;但更好的策略是使用Reponse.Flush方法。这个方法把所有已经由ASP生成的HTML输出到浏览器中。例如,一个1,000行的大表,在写完100行之后,ASP可以调用Response.Flush来强制把结果写到浏览器中,这样,用户就可以在其余行生成之前先看到100行数据。这个技术能让你两全其美—响应缓冲和渐进式地在浏览器表现数据。 

  (注意,在上面的1,000行表的例子中,很多浏览器在遇到</table>标记之前可能并不画出整个表。如果想让浏览器逐步显示出数据,可以将一个大表分成多个小表,然后对每个小表调用Response.Flush。新版本的IE会在下载完整个表之前显示表,并且如果指定了表的列宽,显示的速度会更快。) 

  另外,当产生一个非常大的页面时,响应缓冲可能会消耗掉许多的服务器内存。这个问题也可以通过使用Response.Flush来解决。

  技巧15:脚本大块化和Response.Write语句

  VBScript语法<% = 表达式 %>把“表达式”的值写到ASP输出流中;但如果响应缓冲没有打开,每个这样的语句都会想浏览器写数据,就把网络流分成很多小的包。这样会慢。同样,零星的小段脚本和HTML导致频繁的在脚本引擎和HTML之间切换,降低了性能。因此,应该使用以下技巧:把小块内嵌表达式改成调用Response.Write。例如,在下面的例子中,每行的每个字段都向响应流中写数据,并且每行都在VBScript和HTML中切换: 

<table> 
<% For Each fld in rs.Fields %> 
  <th><% = fld.Name %