安大互联
财经热点 > Asp编程 > 如何增强ASP程序性能(1)
如何增强ASP程序性能(1)
浏览次数:【730】  发布日期:2009-8-13 12:09:22    文章分类:Asp编程   
专题:】 【
 
如何增强ASP程序性能(1)
2000-08-10· 甘冀平·Yesky

简介

  性能是一个很关键的特征。你需要事先设计好性能指标,不然日后就要为此重新编写程序。就是说:要设想好怎样最佳化地执行ASP程序?

  本文提出了一点优化ASP应用和VBScript的技巧,许多技巧和缺陷都经过了研讨。这里列出的建议已经在http://www.microsoft.com 和其它站点上进行了测试,都工作得非常好。本文假设你具备ASP开发的基本知识,包含VBScript或JScript,ASP应用程序,ASP Session,和其它ASP内置对象(Request,Response和Server)。

  通常,ASP的执行性能远远不仅仅依赖ASP代码本身!在本文的尾部列出了与性能相关的资源,它们含概了ASP和非ASP的部分,包含ActiveX Data Objects(ADO),Component Object Model(COM),数据库(Database),和Internet信息服务器(IIS)的配置。除了这些,还有一些非常不错的链接值得你一看。

技巧1:在Web服务器上缓存我们时常使用的数据

  典型的情景是:ASP页面从后台存储中取回数据,然后以超文本标记语言(HTML)的形式形成结果。不管数据库的速度咋样,从内存中取回数据要比从后台存储设备中快得多。从本地硬盘读取数据通常也非常快。因此,提高性能可以通过缓存服务器上的数据来实现,甭管是将数据缓存在内存中,或本地硬盘中。

  缓存是经典的“空间换时间”的折中方式。如果缓存得恰当,就可以看到明显的性能提升。为了让缓存有效,务必保证缓存数据是我们时常要重用的,而且也是计算起来繁琐的。装满陈旧数据的缓存是对内存的浪费。

  不我们时常改变的数据是缓存的较好对象,因为不用随时考虑这些数据更新后的同步操作。组合框、参考表格、DHTML代码、扩展标记语言串、菜单和站点配置变量(包含数据源名字DSNS,Internet协议地址IP和Web路径)都是很好的缓存对象。注意:要缓存数据表达式而不是数据本身。如果一个ASP页面我们时常变化并且很费力去缓存(好比整个产品目录),就要考虑预发生HTML,而不是每次发生请求时再描述它。

技巧2:在Application或Session对象中缓存我们时常使用的数据

  ASP中的Application和Session对象是在内存中缓存数据的便利容器。你可以将数据赋值给Application和Session对象,这些数据在HTTP调用期间将一直维持在内存中。Session中的数据是为每一个用户服务的,Application中的数据是所有用户共享的。

  何时需要在Application和Session中装入数据?通常,当应用程序启动或会话开始时,数据就被装入了。为了在这时装入数据,在Application OnStart()或Session OnStart()中分别添加适当的代码。这些函数位于文件Global.asa中,如果原来不存在,就添加上。也可以在数据第壹次期望的时候调入,在ASP页面中添加代码,检查数据是否存在,如果没有发现,就调入它。这里有一个例子,它代表了被称为“lazy evalution”的经典性能处理技术:直到需要时,再去计算。例子如下:

<%
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
%>

对于不一样的数据,可以编写类似的函数代码。

  数据应该按什么格式保存?任何变量类型都能,因为所有的脚本变量都是不一样的。例如说,可以保存为字符串、整型或数据。通常,将ADO记录集的内容存储到这些变量类型中一个。为了从ADO记录集中取出数据,需要手工地拷贝数据到VBScript变量中,每次一个字段。使用任意一个ADO记录集的函数functions GetRows(),GetString() 或 Save() (ADO 2.5)都特别得快速而且简单,这里有个函数,描述了如何使用GetRows()返回记录集数据的数组:

' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject("ADODB.Recordset")
rs.Open "select StatusName, StatusID from EmployeeStatus", _
"dsn=employees;uid=sa;pwd=;"
FetchEmploymentStatusList = rs.GetRows() " Return data as an Array
rs.Close
Set rs = Nothing
End Function

上述代码的一个更深的技巧是为列表缓存了HTML。下面是个容易的案例:

' Get Recordset, return as HTML Option list
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 Field Binding
Do Until rs.EOF
' Next line violates Don't Do String Concats,
' but it's OK because we are building a cache
s = s & " <option>" & fldName & "</option>" & vbCrLf
rs.MoveNext
Loop
s = s & "</select>" & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function

在适当的环境下,可以在Application或Session中缓存ADO记录集本身,可是有2点提示:

ADO务必是自由线程标记的
需要使用disconnected recordset方式
  假如不能确保上述2个条件,就不要缓存ADO记录集,因为这会发生很大的危险性。

  当在Application或Session中保存数据后,数据将一直维持,除非程序改变它、Session变量到期或Web应用程序重新启动。如果数据需要更新,咋办?可以调用只有管理员才能访问的ASP页面来更新数据,或,通过函数周期性的自动更新数据。下面的案例中,与缓存数据一起保存了时钟标记,过一段时期后,就刷新数据。

<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds

' Function to return the employment status list
Function GetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList = Application("EmploymentStatusList")
End Function

' Periodically update the cached data
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 func

手机扫码浏览该文章
 ● 相关资讯专题
  • 网络建设业务咨询

   TEl:13626712526