微软建议的ASP性能优化28条守则(5)
作者:微软 来源:微软 发布时间:2008-02-27 13:54:00
阅读上一篇:微软建议的ASP性能优化28条守则(4)
技巧 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.Fields
Response.Write (?<th>? & fld.Name & ?</th>? & vbCrLf)
Next
While Not rs.EOF
Response.Write (?<tr>?)
For Each fld in rs.Fields %>
Response.Write(?<td>? & fld.Value & ?</td>? & vbCrLf)
Next
Response.Write ?</tr>?
Wend
%>
</table>
当禁用响应缓冲时,这一技巧的效果特别大。最好启用响应缓冲,然后看批处理 Response.Write 是否有助于提高性能。
(在这一特定举例中,建立表主体的嵌套循环 (While Not rs.EOF...) 可以用仔细构建的 GetString 调用来替代。)


猜你喜欢
- 在深度学习中训练模型的过程中读取图片数据,如果将图片数据全部读入内存是不现实的,所以有必要使用生成器来读取数据。通过列表生成式,我们可以直接
- 最近pytorch出了visdom,也没有怎么去研究它,主要是觉得tensorboardX已经够用,而且用起来也十分的简单pip insta
- 这篇文章主要介绍了python中的引用和拷贝实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 这个坐标轴变名用法,我真服气了,我在网上看大家写的教程,看的头晕,也没看懂他们写xtick到底怎么用的,最后找到官方教程,看了一个例子,ov
- 给zblog添加上“运行代码”的功能,这是“密陀僧”修改z-blog源码,给z-bog增添的新功能。这个方法出来很久了,我现在才加上还不晚吧
- Mac安装python3环境首先我先给说明一下:我也是初次接触python,有一定的Java基础,对编程语法有一定基础,当然小菜在这里全当小
- 1、各种用法说明A. 最简单的用法:mysqldump -uroot -pPassword [database name] &g
- 在开发的时候,用户要求在认证的时候自动添加xadmin登录账户和分配组权限from django.contrib.auth.models i
- 先看一下合并后的样式,表格第二行,二三四列合并官网给我们提供了span-method的方法可以进行表格合并,有4个参数返回:row,colu
- 本文实例讲述了Python实现的视频播放器功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#! pytho
- 实战场景本篇博客为大家介绍一款新的自动化测试工具,效果类似 selenium,但是这个模块年轻。模块名称为 playwright-pytho
- 基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的
- 1.启动H2数据库不打开浏览器窗口(默认是打开的) 2.数据库创建SQL增加了支持BigDecimal类型,h2数据库默认是不支持bigde
- 关于python 性能提升的一些方案。一、函数调用优化(空间跨度,避免访问内存) 程序的优化核心点在于尽量减少操作跨度,包括代码执
- 本周的豆知识分享就来深入研究一下window.event对象。请先看看下边的代码片断。 <button id=”btn”&g
- python中支持SSH协议的模块主要有Paramiko和netmiko两种,本次实验采用netmiko模块。netmikko模块为pyth
- Mac 下 Flask 框架 workon命令找不到 ---- 最终解决方案(详解具体实现操作过程中遇到的坑)2018年08月17日 00:
- 本文实例讲述了python函数局部变量用法。分享给大家供大家参考。具体分析如下:当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其
- 问题定义一个int型的一维数组,包含10个元素,分别赋值为1~10, 然后将数组中的元素都向前移一个位置,即,a[0]=a[1],a[1]=
- 前一阵子经理问我能不能把用户最后一次登录我们的业务数据库的时间记录下来,因为之前有人修改过数据库sa用户的登录密码,所以我们要记录一下。 我