当前位置:首页 > 芯闻号 > 充电吧
[导读]技巧11:使用Response Buffering   通过打开“response buffering”可以缓冲一个值得输出的整个页面内容,这将最小化输出到浏览器的数据量,从而提高了整体性能。每一次输

技巧11:使用Response Buffering

  通过打开“response buffering”可以缓冲一个值得输出的整个页面内容,这将最小化输出到浏览器的数据量,从而提高了整体性能。每一次输出都耗费许多,所以写得越少,效果越好。TCP/IP在发送少量大的数据包时,要比发送大量小的数据包工作效率高,因为它是慢速启动并不断发送的。

  有2种方法打开Response Buffering。首先,可以使用Internet Services Manager为整个应用程序打开response buffering,这是推荐的方式,而且在IIS4.0和IIS5.0中,默认状态下,response buffering是打开的。其次,在每一页面上,可以在头部放置如下代码开打开response buffering:

< % Response.Buffer = True % >

  这段代码必须在任何数据输出到浏览器前被执行(就是说,在任何html内容显示前和在任何cookie被设置前)。通常情况下,为整个应用程序打开response buffering是很好的方案,这么做后就不用在每个页面头部设置如上的代码。

  关于打开response buffering的一个通用问题是:用户必须要等待整个页面全部产生后,才能看到内容。对于一个长时间运行的页面来说,可以设置Response.Buffer=False关闭缓冲。然后,好的策略是利用Response.Flush方法,它将输出所有已被ASP描述的HTML内容到浏览器。比如,在描述了一个1,000行表格的100行后,ASP就可以使用Response.Flush来强迫输出这100行的内容到浏览器,这时用户就可以看到前100行数据,同时其余的行数据正在准备生成。

  注意,关于上面的1,000行表格输出的例子,对于一些浏览器器来说,除非遇到$#@60; /table $#@62;标记,它们不会输出表格的任何内容。如果这样,可以将表格分割成许多含有少量行的多个表格,然后在每一个表格产生后,调用Response.Flush输出。新版的Internet Explorer在整个表格下载后才显示内容,并且,如果定义了表格的列宽度,生成表格的速度将特别快。

关于打开response buffering的另外一个问题是:当生成非常大的页面时,将消耗非常大的服务器内存。

技巧12:批处理单行脚本和Response.Write命令

  VBScript语法$#@60; % = expression % $#@62;的意思是输出expression的数值。如果response buffering没有打开,每个这样的语句将按照许多小数据包的形式输出数据到浏览器,这将降低程序性能。因此,请使用下面的技巧: 唤舭ぷ诺亩喔鲆恍斜泶锸降饔梦桓龅饔茫肦esponse.Write名称输出。比如,在下面的例子中,对于每行每个字段的输出,只有一个写操作:
$#@60;table$#@62;
$#@60;% For Each fld in rs.Fields %$#@62;
 $#@60;th$#@62;$#@60;% = fld.Name %$#@62;$#@60;/th$#@62;
$#@60;%
Next 
While Not rs.EOF
%$#@62;
 $#@60;tr$#@62;
 $#@60;% For Each fld in rs.Fields %$#@62;
 $#@60;td$#@62;$#@60;% = fld.Value %$#@62;$#@60;/td$#@62;
 $#@60;% Next 
 $#@60;/tr$#@62;
 $#@60;% rs.MoveNext 
Wend %$#@62;
$#@60;/table$#@62;
下面是更有效率的代码,每行一个输出:
$#@60;table$#@62;
$#@60;%
 For each fld in rs.Fields
 Response.Write ("$#@60;th$#@62;" & fld.Name & "$#@60;/th$#@62;" & vbCrLf)
 Next
 While Not rs.EOF
 Response.Write ("$#@60;tr$#@62;")
 For Each fld in rs.Fields %$#@62;
 Response.Write("$#@60;td$#@62;" & fld.Value & "$#@60;/td$#@62;" & vbCrLf)
 Next
 Response.Write "$#@60;/tr$#@62;"
 Wend
%$#@62;
$#@60;/table$#@62;
  当response buffering关闭时,这个技巧非常得有用。最好是打开response buffering,这样就可以看到批量的Response.Wwrite是如何提高了程序性能。

技巧13:使用$#@60; OBJECT $#@62;标记引用对象

  如果需要引用除代码路径外的对象(尤其是服务器、Application范围的对象),请在Global.asa文件中使用
$#@60; object runat=server id=objname $#@62;标记来定义它们,而不要使用Server.CreateObject方法。使用Server.CreateObject方法可以立即创建对象,这样如果随后不使用它,就浪费了资源。使用
$#@60; object id=objname $#@62;标记可以定义对象objname,但是直到它的属性或者方法首次使用时,objname才实际创建。

技巧14:避免在循环中串联字符串

许多人在循环中建立一个字符串,就象下面的样子:
s = "$#@60;table$#@62;" & vbCrLf
For Each fld in rs.Fields
 s = s & " $#@60;th$#@62;" & fld.Name & "$#@60;/th$#@62; "
Next

While Not rs.EOF
 s = s & vbCrLf & " $#@60;tr$#@62;"
 For Each fld in rs.Fields
 s = s & " $#@60;td$#@62;" & fld.Value & "$#@60;/td$#@62; "
 Next
 s = s & " $#@60;/tr$#@62;"
 rs.MoveNext
Wend

s = s & vbCrLf & "$#@60;/table$#@62;" & vbCrLf
Response.Write s
  这存在几个问题。首先是重复的连接字符串消耗二次方的时间,而且,运行的时间与计算的字段数量也是平方的关系。下面的简单例子更清楚地说明这一点:
s = ""
For i = Asc("A") to Asc("Z")
 s = s & Chr(i)
Next
  在第1层循环时,S的值是“A”;第2层循环时,VBScript要重新分配字符串,拷贝了2个字符(“AB”)到S中;第3层循环时,需要再重新分配并且拷贝3个字符到S中。在第N层循环时,就需要重新分配并拷贝N个字符到S中。那就是1+2+3+...+N的总和,也就是N*(N+1)/2个拷贝。

  在上面的记录集例子中,如果有100个记录和5个字段,内部循环就要执行100*5=500次,并且,完成所有拷贝和再分配任务的时间将接近500*500=250,000。这还是一个适当尺寸记录集的拷贝工作。

  在这个例子中,可以通过替换字符串连接为Response.Write()或者行内脚本($#@60; % =fld.Value % $#@62;)的方法提高程序性能。如果response buffering打开(也应该打开),这将很快,因为Response.Write仅仅附加数据在缓冲区的尾部,而且不需要再分配。

  如果用JScript连接字符串,强烈建议使用“+=”操作符,就是说,使用s+=“字符串”,而不是s = s+“字符串”。

技巧15:打开浏览器和代理的缓冲

  默认情况下,ASP禁止了浏览器和代理的缓冲功能。如果有一个每次都不要更新的页面,就应该打开浏览器和代理的缓冲,这将允许浏览器和代理在一段时间内使用该页面的“缓冲”拷贝数据。缓冲能够大大地减轻服务器的数据转载量,并提高用户的浏览性能。

哪些类别的动态页面适合被缓存呢?下面是一些例子:
天气页面,每5分钟更新一次 新闻或版本列表页面,每天更新2次   注意:使用浏览器或者代理缓存后,对Web服务器的点击次数就会减少。如果想精确地了解所有页面,或者对于邮递广告,就不适于使用浏览器和代理缓存了。

  浏览器缓存由HTTP“Expires”头参数控制,它由Web服务器发送给浏览器。ASP提供了2个简单的方法发送这个头部参数。设置页面在未来一定时间内到期,可以使用Response.Expires属性。下面的例子将告诉浏览器内容在10分钟后过期:

$#@60; % Response.Expires = 10 % >

  设置Response.Expires为负数或者0,就禁止了缓存。对第2个属性Response.ExpiresAbsolute的设置,允许指定在一个特殊时间到来时内容过期。

$#@60; % Response.ExpiresAbsolute = #May 31,2001 13:30:15# % >

  除了使用Response对象来设置到期时间,还可以在HTML文件头部写$#@60; META $#@62;标记。尽管代理不会注意到这个标记,但是一些浏览器可以。

$#@60; META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15" >

  最后,对于HTTP代理,使用Response.CacheControl可以指示是否缓存内容。设置属性为“Public”,打开代理缓存内容的功能。

$#@60; % Response.CacheControl = "Public" % >

  默认情况下,这个属性是设置成“Private”的。注意:不要让代理缓冲那些显示给特定用户的页面,因为代理可能会将属于其他用户的页面送给当前用户。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在这篇文章中,小编将为大家带来浏览器缓存的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 浏览器 缓存 浏览器缓存

为增进大家对浏览器缓存的认识,本文将对浏览器缓存的清空方法以及清空浏览器缓存时需要注意的事项予以介绍。

关键字: 浏览器 指数 缓存

浏览器缓存是计算机存储技术中的一种机制,主要用于临时存储网页资源(如图片、脚本、样式表等),以便在用户再次访问相同网站时能够快速加载页面内容,提高浏览速度。然而,随着时间的推移,缓存中的数据可能会过期或导致网站显示不正常...

关键字: 浏览器 缓存清除

纳德拉曾表示:“当公司的核心产品不复往日风采时,推到重来极其困难。我一直在观察那些能做到这一点的公司,并由此获得启发。” 在《刷新:重新发现商业与未来》这本书中,纳德拉回顾了自己早年的工作经历,并对就任微软首席执行官以来...

关键字: 核心产品 浏览器 市场

今天,微软为Win11推送了22H2版本Release预览版的KB5019509更新,在现有22H2稳定版的基础上,提前加入了部分新功能。在KB5019509更新中,Win11终于加入了用户翘首以盼的标签式文件资源管理器...

关键字: WIN 微软 RELEASE 浏览器

QQ浏览器是腾讯科技(深圳)有限公司开发的一款浏览器,其前身为TT浏览器。QQ浏览器秉承TT浏览器1-4系列方便易用的特点,但技术架构不同;交互和视觉表现也重新设计。

关键字: QQ 浏览器 IE

举个单位的例子吧,我们单位前几年请外边的网络公司开发一个网上报账APP,所有人员报账只需将相关报账票据上传网上后,一切审批流程都在网上流转。

关键字: 工程师 IE 浏览器

微软Edge浏览器将在2029年或更晚的时间点前继续支持IE模式。因此,网站只要与之前的网页引擎兼容,就不会遇到问题。不过,微软在推广Edge浏览器时的步子很大。微软将在未来几个月“稳步”将用户从IE引导至Edge浏览器...

关键字: 微软 IE 浏览器

在2022年6月补丁中,Internet Explorer浏览器正式退出历史舞台。微软表示从现在起IE浏览器不会有任何的错误或者漏洞修复,希望用户切换到Microsoft Edge浏览器上。

关键字: 浏览器 Internet Explorer

(全球TMT2022年5月17日讯)近日,Cision旗下公司美通社宣布推出新服务 -- 中国大陆新媒体精选发布。此项服务将帮助企业把品牌新闻稿发布到较为广泛的各类新媒体平台,借助权威媒体的转载构建相关受众强品牌认知,...

关键字: 微信 CIS 浏览器 矩阵
关闭
关闭