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 是否改变对象模型,因此必须再次执行
  7. 步骤 1 至 3 以解析 baz。
  8. 将 baz 解析为 Foo.bar.blah 的成员。赋予属性。
  9. 再次执行步骤 1 至步骤 3 以解析 zaq。
  10. 再次执行步骤 1 至步骤 3 以解析 abc。 正如您可看到的,效率相当差(且慢)。以 VBScript 写此代码的快速方法是:

Set myobj = Foo.bar.blah ’ do the resolution of blah ONCEMyobj.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:避免重新确定数组的维数 应尽量避免 Redim 数组。就性能而言,如果计算机的物理内存大小有限,最好将数组的初始维数设置为其最不利的情况 - 或将维数设置为其最佳的情况,然后再按需要重新确定维数。这并非意味着,如果知道您不需要内存时,就随便分配几兆字节的内存。 下面的代码给您显示使用 Dim 和 Redim 不当的情形。 <% Dim MyArray()Redim MyArray(2)MyArray(0) = ?hello?MyArray(1) = ?good-bye?MyArray(2) = ?farewell?...’ some other code where you end up needing more space happens, then ...Redim Preserve MyArray(5)MyArray(3) = ?more stuff?MyArray(4) = ?even more stuff?MyArray(5) = ?yet more stuff?%>

最好一开始就将数组的初始大小 Dim 正确(在本例中,是 5)比 Redim 数组使其更大好得多。您可能浪费一些内存(如果您没有使用所有的元素),但获得的好处是速度变得更快。

技巧 14:使用响应缓冲 您可以通过启用“响应缓冲”,将要输出的一整页缓冲起来。这样就将写到浏览器的量减到最少,从而改善总体性能。每个写操作都会产生很大的系统开销(在 IIS 中以及在通过网络发送的数据量方面),因此写操作越少越好。由于其启动慢且使用 Nagling 算法(用来减轻网络塞车情况),TCP/IP 在发送一些大的数据块时比必须发送许多小的数据块时的效率高得多。 有两个方法启用响应缓冲。第一种,您可以使用 Internet Services Manager 为整个应用程序启用响应缓冲。我们建议采用这种方法,在 IIS 4.0 和 IIS 5.0 中默认为新的 ASP 应用程序启用响应缓冲。第二种,可以在每个 ASP 页面的接近顶端的地方加入下面的代码行,从而启用响应缓冲: <% Response.Buffer = True %>此代码行必须在任何响应数据被写到浏览器之前执行(即,在任何 HTML 出现在 ASP 脚本之前以及在使用 Response.Cookies 集合设置任何 Cookies 之前)。一般来说,最好为整个应用程序启用响应缓冲。这样,您就不必在每个页面最上面写入上述的代码行。 Response.Flush关于响应缓冲有一个常见的抱怨,就是用户感觉到 ASP 页面的响应速度很慢(即使整个响应时间得到改进),因为他们必须等到整个页面生成,然后他们才能看到东西。对于运行时间长的页面,您可以设置 Response.Buffer = False,禁用响应缓冲。但是,一个更好的策略是利用 Response.Flush 方法。这种方法将 ASP 转换的所有 HTML 送到浏览器。例如,在转换 1,000 行的表的前 100 行之后,ASP 可以调用 Response.Flush,强制将转换的结果送到浏览器,这样可使用户在其余的行准备好之前看到头 100 行。这种技术可以将响应缓冲与浏览器逐渐显示数据完美地结合在一起。 (注意在上面的 1,000 行表的举例中,许多浏览器在它们看到关闭 </table> 标记之前不会开始显示表。检查您的目标浏览器是否支持。为避免这种情况,将表分成多个具有较少行的表,并在每个表之后调用 Response.Flush。较新版本的 Internet Explorer 在表完全下载之前就开始显示表,如果您指定表列宽,显示速度就会特别快,这样做可避免强制 Internet Explorer 通过测量每个单元格的内容宽度来计算列宽。) 另一个关于响应缓冲的常见的抱怨是,当产生非常大的页面时,将占用许多服务器内存。撇开产生大页面的方法不谈,这种问题也可通过巧妙使用 Response.Flush 来加以解决。 技巧 15:批处理内嵌脚本和 Response.Write 语句 VBScript 语法 <% = expression %> 将“expression”的值写到 ASP 输出流中。如果响应缓冲未启用,那么执行其中的每一条语句,都会以许多小的数据包通过网络将数据写到浏览器中。这样速度很慢。而且穿插执行少量的脚本和 HTML,将引起脚本引擎和 HTML 之间的切换,从而降低性能。因此,使用下面的技巧:使用 Response.Write 调用代替捆绑紧密的内嵌表达式。例如,在下面的示例中,在每一行的每一字段对响应流有一次写操作,每一行在 VBScript 和 HTML 之间有许多切换: <table><% For Each fld in rs.Fields %><th><% = fld.Name %></th><%Next While Not rs.EOF%><tr><% For Each fld in rs.Fields %><td><% = fld.Value %></td><% Next </tr><% rs.MoveNext Wend %></table>下面的代码更有效,每一行对响应流有一次写操作。所有的代码都包含在一个 VBScript 块内:

<table><%For each fld in rs.FieldsResponse.Write (?<th>? & fld.Name & ?</th>? & vbCrLf)NextWhile Not rs.EOFResponse.Write (?<tr>?)For Each fld in rs.Fields %>Response.Write(?<td>? & fld.Value & ?</td>? & vbCrLf)NextResponse.Write ?</tr>?Wend%></table>

当禁用响应缓冲时,这一技巧的效果特别大。最好启用响应缓冲,然后看批处理 Response.Write 是否有助于提高性能。 (在这一特定举例中,建立表主体的嵌套循环 (While Not rs.EOF...) 可以用仔细构建的 GetString 调用来替代。) 技巧 16:如果页面需要很长时间才能完成,那么执行前使用 Response.IsClientConnected 如果用户性急,他们可能会在您开始执行他们的请求之前,就会放弃 ASP 页面。如果他们单击刷新或移到服务器上的另一个页面,在 ASP 请求队列的末尾就有一个新的请求等候,在队列的中间有一个断开连接的请求。当服务器的负载很高时(因此请求队列就会很长,响应时间也会相应地变长),就会经常发生这种情况,这样只能使情况变得更糟。如果用户不再连接,执行 ASP 页面(特别是慢的、大的 ASP 页面)已没有任何意义。您可以使用 Response.IsClientConnected 属性检查这一情况。如果它返回 False,则应调用 Response.End 并放弃页的其余部分。事实上,IIS 5.0 已将这一做法编为程序 - 每当 ASP 即将执行新请求时,它就会检查请求在队列中已等候了多长时间。如果已经在那里等候了多于 3 秒钟,ASP 将检查客户机是否仍处于连接状态,如果没有连接,就立即终止请求。您可以在配置数据库中使用 AspQueueConnectionTestTime 设置将超时时间由 3 秒调整为其它值。 如果页面要花很长时间才能执行完,也可以不时地检查 Response.IsClientConnected。当启用了响应缓冲时,最好不时地执行 Response.Flush,以用户知道,正在发生什么事。 注意 在 IIS 4.0 上,除非先执行了 Response.Write,否则 Response.IsClientConnected 就不能正常工作。如果启用了缓冲,您也必须执行 Response.Flush。在 IIS 5.0 上,却没有必要这样做,- Response.IsClientConnected 工作正常。在任何情况下,Response.IsClientConnected 都会有一些开销,因此只有在一个操作至少要花(比方说) 500 毫秒(如果您想维持每秒钟数十页的吞吐量,这是一个很长的时间)才使用它。经验表明,不要每次重复执行紧密循环时都调用它,如显示表的许多行时 - 每隔二十或五十行调用一次可能比较合适。 技巧 17:使用 <OBJECT> 标记例示对象 如果要引用不在所有代码路径(特别是服务器或应用程序作用域的对象)中使用的对象,使用 Global.asa 中 <object runat=server id=objname> 标记声明它们,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即创建对象。如果以后不再使用该对象,您就浪费了资源。<object id=objname> 标记声明 objname,但在其方法或属性第一次使用以前,不会创建 objname。 这又是一个惰性计算的例子。

技巧 18:对于 ADO 和其它组件使用 TypeLib 声明 当使用 ADO 时,开发人员经常加入 adovbs.txt,以访问 ADO 的各种常量。在要使用常量的每个页面中必须包含此文件。此常量文件相当大,给每个 ASP 页面的编译时间和脚本大小增加了许多系统开销。 IIS 5.0 引入了绑定到组件类型库的功能。这可使您引用类型库一次,并将其用在每个 ASP 页面上。每个页面不会产生编译常量文件的开销,且组件开发人员不必建立 VBScript#_include 文件以在 ASP 上使用。 要访问 ADO TypeLib,将下面一条语句放在 Global.asa 中。

转载于:https://www.cnblogs.com/spring4/archive/2007/03/29/2483825.html

二十八条改善ASP性能和外观的技巧(三)相关推荐

  1. 二十八条改善 ASP 性能和外观的技巧

    摘要:本文介绍优化 ASP 应用程序和 VBScript 的技巧. 目录 技巧 1:将经常使用的数据缓存在 Web 服务器上 技巧 2:将经常使用的数据缓存在 Application 或 Sessio ...

  2. 深度学习之图像分类(二十八)-- Sparse-MLP(MoE)网络详解

    深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 目录 深度学习之图像分类(二十八)Sparse-MLP(MoE)网络详解 1. 前言 2. Mixture of Experts 2 ...

  3. RecyclerView完全解析,让你从此爱上它(二十八)

    RecyclerView完全解析,让你从此爱上它(二十八) 2015-11-20      0 个评论   来源: 专注移动开发,项目管理.jiangqqlmj   收藏   我要投稿 (一).前言: ...

  4. MySQL二十八规范数据库设计

    MySQL二十八:规范数据库设计 糟糕的数据库设计: ●数据冗余,浪费空间 ●数据库插入和删除都会麻烦.异常[ 屏蔽使用物理外键] ●程序的性能差 良好的数据库设计: ●节省内存空间 ●保证数据库的完 ...

  5. 关闭数字健康 android 魅族,数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享...

    数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享 2019-09-06 17:31:22 14点赞 10收藏 15评论 当我还一直在称赞魅族16s所拥有的舒适手感表现时, ...

  6. kafka maven 依赖_SpringBoot入门建站全系列(二十八)整合Kafka做日志监控

    SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...

  7. SpringBoot入门建站全系列(二十八)整合Kafka做日志监控

    SpringBoot入门建站全系列(二十八)整合Kafka做日志监控 一.概述 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端 ...

  8. 无人驾驶汽车系统入门(二十八)——基于VoxelNet的激光雷达点云车辆检测及ROS实现

    无人驾驶汽车系统入门(二十八)--基于VoxelNet的激光雷达点云车辆检测及ROS实现 前文我们提到使用SqueezeSeg进行了三维点云的分割,由于采用的是SqueezeNet作为特征提取网络,该 ...

  9. mysql revoke 用法_mysql进阶(二十八)MySQL GRANT REVOKE用法

    mysql进阶(二十八)MySQL GRANT REVOKE用法 MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执行查 ...

最新文章

  1. 干货 | 清华大学郑方:语音技术用于身份认证的理论与实践
  2. 一篇小的随笔,关于记忆算法和概念
  3. Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session
  4. 从零开始玩转JMX(四)——Apache Commons Modeler Dynamic MBean
  5. mysql 设置时区,【MySQL】修改时区设置
  6. 插入的数据不能时时查询到_数据库原理笔记
  7. ubuntu kylin mysql_Ubuntu16.04下Kylin的安装与配置
  8. SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
  9. python manager ulimit_Linux ulimit命令
  10. 1编写偏移量为3的凯撒密码大小写混合加密程序(50分)
  11. vue 对象提供的属性功能、通过axio请求数据(2)
  12. rsh服务配置主机无密码访问
  13. 计算机视觉 图像形成 几何图形和变换
  14. 语句摘抄——第29周
  15. Archlinux arm的国内镜像源(for Banana Pi / Raspberry Pi , etc)
  16. codeBlock软件下面的框不见了,怎么办?
  17. C/C++面试题-2 之2/2
  18. 深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别
  19. 特征函数和概率密度函数的关系
  20. FL Studio12中Fruity Blood Overdrive插件使用教程

热门文章

  1. Word2010 给公式添加序号时公式变小解决方案
  2. php怎么配置configure,PHP编译参数configure配置详解(持续更新中)
  3. db2 语句包括不必要的列表_列表推导和生成器表达式的滥用
  4. 布尔(bool)全排列
  5. 易方机器人教育怎么样_定州3岁以上儿童机器人教学多少钱
  6. android shell强制删除文件夹_别再乱清手机内存了,删除这3个“特殊”文件夹!空间释放8GB...
  7. 在哪里编写写php,php扩展编写
  8. nginx哪个版本性能好_骁龙750g和天玑1000+哪个好-参数性能对比
  9. java为什么不能输入钢筋符号_input.nextDouble();找不到符号
  10. linux中写如空格参数,Vim中Tab与空格缩进