日期:2008-09-07  浏览次数:21087 次

作者:Nancy Cluts    微软技术开发部工程师

技巧1:给应用层文件使用GLOBAL.ASA
技巧2:从产品源代码中移去HTML注释
技巧3:多个Response.write声明
技巧4:使用<OBJECT>标志例示对象
技巧5:尽可能的使用本地(局部)变量
技巧6:避免多维数组
技巧7:避免公用(全局)变量
技巧8:使用文字路径
技巧9:使用"Dictionary"对象
技巧10:充分利用浏览器的回退功能
技巧11:避免使用服务器端变量
技巧12:使用"option explicit"      
技巧13:将采集到的值拷贝到本地(局部)变量当中
技巧14:谨慎使用session对象
技巧15:做性能测试

*技巧1:给应用层文件使用GLOBAL.ASA

    将文件载入GLOBAL.ASA中的一个应用层数组中,而不是通过使用ASP文件系统对象在页面上读取文件。
    GLOBAL.ASA可用于指定事件脚本,也可用于声明拥有session或应用程序范围的对象。它不直接显示给用户,而是存储应用层事件的信息和对象。然后通过页面就可以指向存有数据的应用层数组。这就意味着每有一个服务器端请求就读一次文件,不是每个用户每页读一次。你可以运行一个独立的ASP文件去刷新应用层数组的内容,同时你也可以考虑使用dictionary对象(见技巧9)。
    这个技巧可以大大加快你的系统速度。
    那么将如何实现该技巧呢?
    如果你是一个脚本编写人员,必须使用文件系统对象读取文件放入一个数组或一个dictionary对象中。然后在GLOBAL.ASA中读取文件并且把数组(放有你读取的文件内容)或dictionary对象放到应用层声明中。这样就可让用户在数组或dictionary对象中存取信息,而不必每次通过一个ASP请求去提交信息。
    但也许你会想“如果缓存中的内容需要更新又该怎么办呢?我敢打赌不会用到。”其实不然。如果缓存中的内容需要更新,你可以调用一个包含有可执行应用程序锁定命令脚本的仅管理员可存取的ASP文件,在数组或dictionary对象中更新缓存信息,最后执行应用程序锁定命令。   

*技巧2:从产品源代码中移去HTML注释(IIS3.0适用)
   不错,难写的肯定也难懂。开个玩笑,这不代表要你把所有的HTML注释去掉(脚本注释就挺好的),大范围的HTML文本都能成批的拷贝到客户端。这样的话,你的脚本在IIS3.0上会运行得更快(在IIS4.0中,HTML注释不再会导致执行速度的降低)。

*技巧3:多个Response.write声明
     如果你是在代码中的好几个地方用<%=...%>格式书写输出结果,那么考虑一下把这些结果合到一块,用一个Response.write语句写出来。然后你再看看你的HTML代码和vbscript脚本的组成。不要把HTML和vbscript脚本散布得太开,尽量写成成块的HTML和vbscript脚本。

*技巧4:使用<OBJECT>标志例示对象
   如果你需要指向那些也许用不着的对象,那么就用<OBJECT>标志例示,而不是用Server.createobject.用Server.createobject将立刻生成该对象,如果你以后都用不着它的话,就等于浪费资源。

*技巧5:尽可能的使用本地(局部)变量
  (以下的新技巧将取代较早前发布的“在一行内定义变量”,其中包含有一些错误观点):
   局部变量是在子程序和函数中定义的(也就是常说局部范围的变量),这些变量被编译成数字指向并放入一张表中。这些局部变量的指向可以通过一次编译完成。而全局变量则是在运行时被执行的。这就意味着局部变量的存取要比全局变量快好几倍。而且,多维全局变量是其中最慢的,当第一次使用一个多维全局变量时,在新的对象产生之前,就要在整个对象模型中搜索一遍同名的对象。
  以下是一个非常常见的例子:
  Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
  If Foo.bar.blah.zaq = Foo.bar.blah.abc then
  运行时产生如下结果:
1)变量Foo被定义为一个全局变量
2)变量bar被定义为Foo的一个成员
3)变量blah被定义为Foo.bar的一个成员
4)变量qaz被定义为Foo.bar.blah的一个成员
5)调用 Foo.bar.blah.quaz(1)
6)重复1至3。系统并不知道如果调用qaz改变了对象模型1-3步必须重新执行
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

*技巧6:避免重复定义数组
      当我们在使用dim时,避免重新定义数组。因为你可能要用redim去重新定义数组的大小。至于要做这样的操作的话,如果你的机器内存不是很大,那么最好在一开始就考虑到最坏的打算去设置数组的长度或者设置最佳状态时的长度,在非常必要时才使用redim。当然这样并不意味着要去增加内存,如果你不是很需要的话。
      以下举例说明不恰当的使用redim
      <%
dim MyArray()
Redim MyArrray(2)
MyArray(0) = "hello"
MyArray(1) = "good-bye"
.
.
.
some other code where you end up needing
more space happens then ...
Redim Preserve MyArray(5)
MyArray(2) = "more stuff"
MyArray(3) = "even more stuff"
MyArray(4) = "yet more stuff"
%>
   其实在开始就定义myarray(5),而以后需要的话再用redim去增加他的大小,这样的话可能会占用一些内存,但速度就要快得多了。

*技巧7:避免公用(全局)变量
    不要使用用public定义的变量。如果你是写vbscript或在ActiveX控件或java applet中存取变量,那么尽可能避免公用变量。public关键字通常是为以后使用设计的,既然public不能给你带来什么好处,那最好还是用dim吧。