分享
 
 
 

提高ASP性能的22个技巧(一)

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

技巧1:将常用数据在Web服务器端缓存起来

大部分的ASP页面都要从后台数据库中提取数据,然后将数据用HTML方式表现出来。

不管你的数据库多么快,从内存中提取数据总比从后台数据库中提取快;从本地硬盘中读取数据通常也比从数据库中快。因此,你可以通过在Web服务器端缓存数据来提高性能。

缓存是个典型的以空间换取时间的交易。如果你正确的缓存了数据,性能可能会突飞猛进。要想一个缓存能真正发挥效益,必须缓冲那些常用和计算复杂的数据。装满过期数据的缓冲区只能浪费内存。

不经常变化的数据也是缓存的一个良好候选者,因为你可以不用关心同数据库中的数据保持同步。下拉列表框、引用表、小段DHTML代码,XML字符串、菜单项和站点配置变量(包括数据源名字(DSN),IP地址和Web路径)都是很好的缓存候选者。注意,不仅仅可以缓存数据本身,还可以缓存数据的表现。如果一个ASP页面很少变化,并且缓存代价比较高(比如,产品列表),可以考虑用静态HTML页面。

技巧2:用Application对象或Session对象缓存常用数据

ASP的Application和Session对象是一个极其方便的在内存中缓存数据的容器。你可以把数据放到Application或Session对象中,这些数据就会在整个HTTP调用中一直存在。每个用户有自己的Session对象中的数据,而Application对象中的数据可以在所有用户中共享。

应该在什么时候将数据装入Application或Session中呢?通常,数据在Application或Session启动的时候装入。要想在Application或Session启动的时候装入数据,需要分别在Global.asa的Application_OnStart()或Session_OnStart()中添加适当的代码;如果Global.asa中没有这两个函数,你可以手工添加。也可以在数据第一次使用的时候将其装入。要想这样,应该在ASP页面中写一些代码(或是写一个可重用的脚本函数)来检查数据是否存在并且如果数据不存在则将其装入内存。下面是一个经典的性能调整技术--Lazy Evaluation:

<%

Function GetEmploymentStatusList

Dim d

d = Application("EmploymentStatusList")

If d = "" Then

' FetchEmploymentStatusList function (not shown)

' fetches data from DB, returns an Array

d = FetchEmploymentStatusList()

Application("EmploymentStatusList") = d

End If

GetEmploymentStatusList = d

End Function

%>

Similar functions could be written for each chunk of data needed.

In what format should the data be stored? Any variant type can be

stored, since all script variables are variants. For instance, you

can store strings, integers, or arrays. Often, you’ll be storing the

contents of an ADO recordset in one of these variable types. To get

data out of an ADO recordset, you can manually copy the data into

VBScript variables, one field at a time. It’s faster and easier to

use one of the ADO recordset persistence functions GetRows(),GetString

() or Save() (ADO 2.5). Full details are beyond the scope of this

article, but here’s a function that demonstrates using GetRows() to

return an array of recordset data:

' 获取记录集,返回数组

Function FetchEmploymentStatusList

Dim rs

Set rs = CreateObject("ADODB.Recordset")

rs.Open "select StatusName, StatusID from EmployeeStatus", _

"dsn=employees;uid=sa;pwd=;"

FetchEmploymentStatusList = rs.GetRows() ' 将记录集用数组返回

rs.Close

Set rs = Nothing

End Function

A further refinement of the above might be to cache the HTML for the

list, rather than the array. Here’s a simple sample:

' 获取记录集,返回HTML Option列表

Function FetchEmploymentStatusList

Dim rs, fldName, s

Set rs = CreateObject("ADODB.Recordset")

rs.Open "select StatusName, StatusID from EmployeeStatus", _

"dsn=employees;uid=sa;pwd=;"

s = "<select name=""EmploymentStatus">" & vbCrLf

Set fldName = rs.Fields("StatusName") ' ADO 字段绑定

Do Until rs.EOF

s = s & " <option>" & fldName & "</option>" & vbCrLf

rs.MoveNext

Loop

s = s & "</select>" & vbCrLf

rs.Close

Set rs = Nothing ' 释放rs

FetchEmploymentStatusList = s ' 用字符串方式返回数据

End Function

在正确情况下,你可以将ADO记录集本身缓存在Application或Session范围,但必须满足下面两个条件: .ADO必须被标记为自由线程模型(Free-threaded) .必须使用无连接记录集

如果不能满足上面两个条件,一定不要缓存记录集。在下面的“不灵活的组件”和“不要缓存Connection”两个技巧中,我们将讨论在Application和Session中保存COM对象的危险性。

当你在Application或Session中存储数据后,数据将一直保存,知道你的程序改变它,或是Session过期,或是Web服务重新启动。What if the data needs to be updated?手工刷新Application数据,可以调用只有管理员才可访问的用来刷新数据的ASP页面;或者定期的通过一个函数来周期性的更新数据。下面的例子在缓存数据中保存了一个时间戳,然后一段时间之后自动刷新数据。

<%

Const UPDATE_INTERVAL = 300 ' 刷新间隔,单位是秒

'返回雇员状态列表

Function GetEmploymentStatusList

UpdateEmploymentStatus

GetEmploymentStatusList = Application("EmploymentStatusList")

End Function

'周期性的更新缓存中的数据

Sub UpdateEmploymentStatusList

Dim d, strLastUpdate

strLastUpdate = Application("LastUpdate")

If (strLastUpdate = "") Or _

(UPDATE_INTERVAL < DateDiff("s", strLastUpdate, Now)) Then

' Note: two or more calls might get in here. This is okay and

will simply

' result in a few unnecessary fetches (there is a workaround

for this)

' FetchEmploymentStatusList function (not shown)

' fetches data from DB, returns an Array

d = FetchEmploymentStatusList()

' 更新Application对象时用Application.Lock()来保持数据一致性

Application.Lock

Application("EmploymentStatusList") = Events

Application("LastUpdate") = CStr(Now)

Application.Unlock

End If

End Sub

要知道在Session或Application中缓存大数组并不是一个太好的方法。在访问数组中的任何元素之前,脚本解释器都需要生成一个临时的整个数组的副本。例如,如果你缓存了一个100,000个字符串元素的数组,用来将邮政编码和当地的天气对应一一起来,在访问数组中任何一个字符串之前,ASP解释器首先必须复制所有的100,000个天气情况数据到一个临时数组中。在这种情况下,开发一个组件来储存天气情况数据或是使用词典(Dictioary)对象更为合适一点。不过,也不要因小失大,数组对象的的查找速度更快。索引一个词典比索引一个数组慢。你可以因你的情况而宜,选择合适的数据结构。

技巧3:在硬盘上缓存数据和HTML页面

有时,可能有太多的数据缓存在内存中。“太多”是个模糊的说法,它取决与Web服务器的内存大小、缓存项的数目和这些缓存项被访问的频度。无论如何,如果太多的数据在内存中缓存,可以考虑将数据用文本或XML文件缓存到Web服务器的硬盘上。可以将缓存到硬盘上和到内存中结合起来,针对你的站点,找到最优化的策略。

注意,当我们测量单一ASP页面的性能时,从硬盘上读取数据可能比从数据库中读取慢。但是,缓存能够减少数据库和网络的负载。在高负载的情况下,这将大大提高总体吞吐量。当被缓存的数据是非常复杂的查询,比如多表连接或是一个复杂的查询过程或一个非常大的记录集,缓存的效果将非常明显。

ASP和COM提供了一些工具来建立基于硬盘的缓存方案。ADO Recordset对象的Save和Open方法可以保存和装入到磁盘上。还有一些用来访问文件的组件: .Scripting.FileSystemObject允许你创建、读取和写入文件。 .MSXML,同IE捆绑的微软的XML解释器,支持保存和装入XML文档。 .LookupTable对象是一个用来从磁盘装入简单列表的非常好的选择。

最后,将数据表现缓存在硬盘上,比缓存数据本身要好。生成的HTML可以一个.htm或.asp文件保存在硬盘上;超连可以直接指向那些文件。你也可以用一些商业工具,如XBuilder和SQL Server互连网发布特性,来生成和处理HTML文件。另外,也可以用#include将HTML片段包含到ASP文件中;还可以用FileSystemObject来读取HTML文件。

技巧4:避免在Application或Session对象

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有