二十八条改善 ASP 性能和外观的技巧
Len Cardinal,高级顾问,Microsoft Consulting Services George V. Reilly
Microsoft IIS Performance Lead
改编自Nancy Cluts 的文章 研发人员技术工程师
Microsoft Corporation
2000 年 4 月
摘要:本文介绍优化 ASP 应用程式和 VBScript 的技巧。
目录
技巧 1:将经常使用的数据缓存在 Web 服务器上
技巧 2:将经常使用的数据缓存在 Application 或 Session 对象中
技巧 3:将数据和 HTML 缓存在 Web 服务器的磁盘上
技巧 4:避免将非敏捷的组件缓存在 Application 或 Session 对象中
技巧 5:不要将数据库连接缓存在 Application 或 Session 对象中
技巧 6:合理地使用 Session 对象
技巧 7:将代码封装在 COM 对象中
引言
性能是个特征。您必须预先设计性能,否则您以后就得重写应用程式。就是说,有哪些好的策略可使 Active Server Pages (ASP) 应用程式性能达到最好?
本文介绍了优化 ASP 应用程式和 Visual Basic? Scripting Edition (VBScript) 的技巧。本文讨论了许多陷阱。本文列出的建议已在 http://www.microsoft.com 和其他站点中进行了测试,效果十分显著。本文假定您已对 ASP 研发,包括 VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 固有对象(Request、 Response 和 Server)有了基本了解。
通常,ASP 性能主要取决于 ASP 代码本身以外的很多因素。我们不在一篇文章中罗列出任何的信息,在本文结尾处我们列出了和性能有关的资源。这些链接涵盖了 ASP 和非 ASP 主题,包括 ActiveX? 数据对象 (ADO)、组件对象模型 (COM)、数据库和 Internet Information Server (IIS) 配置。这些都是我们喜欢的一些链接 - 一定要去看看。
技巧 1:将经常使用的数据缓存在 Web 服务器上
典型的 ASP 页从后端数据存储中检索数据,然后将结果转换成超文本标记语言 (HTML)。无论数据库的速度怎样,从内存中检索数据总要比从后端数据存储中检索数据快得多。从本地硬盘读取数据通常也比从数据库中检索数据更快。因此,通常能够将数据缓存在 Web 服务器上(存储在内存或磁盘中),来提高性能。
<%
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
%>
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 = ?? & vbCrLf
rs.Close
Set rs = Nothing See Release Early
FetchEmploymentStatusList = s Return data as a String
End Function
当您将数据存储在 Application 或 Session 作用域时,数据将保留在那里,直到您以编程方式改变他、Session 过期或 Web 应用程式重新启动为止。假如数据需要更新怎么办?要手工强制对 Application 数据进行更新,您能够访问只有管理员才可访问的 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 function (not shown)
fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Update the Application object. Use Application.Lock()
to ensure consistent data
Application.Lock
Application(?EmploymentStatusList?) = Events
Application(?LastUpdate?) = CStr(Now)
Application.Unlock
End If
End Sub
请参见 Worlds Fastest ListBox with Application Data,上面更有一个例子。
技巧 3:将数据和 HTML 缓存在 Web 服务器的磁盘上
有时,数据可能太多,无法都缓存在内存中。“太多”只是个说法,这要看您想消耗多少内存,连同需缓存的项目数和检索这些项目的频率。在任何情况下,假如数据太多而无法都缓存在内存中,则考虑将数据以文本或 XML 文档缓存在 Web 服务器的硬盘上。能够同时将数据缓存在磁盘和内存中,为您的站点建立最适宜的缓存策略。
注意当测量单个 ASP 页的性能时,检索磁盘上的数据可能不一定要比从数据库检索数据更快。但缓存会降低数据库和网络上的负载。在高负载的情况下,这样做可大大改善总体吞吐量。当缓存开销很大的查询结果(如多表联接或复合存储过程)或大的结果集时,这是很有效的。和往常相同,要测试一下几种方案的优劣。
ASP 和 COM 提供一些建立基于磁盘的缓存方案的工具。ADO 记录集 Save() 和 Open() 函数保存和装载磁盘中的记录集。能够使用这些方法重新编写上面 Application 数据缓存技巧中的代码示例,用文档的 Save() 代替写到 Application 对象中的代码。
有一些其他组件能够用于文档:
Scripting.FileSystemObject 可使您创建、读和写文档。
和 Internet Explorer 一起提供的 Microsoft? XML 解析器 (MSXML) 支持保存和装载 XML 文档。
LookupTable 对象(例如,用在 MSN 上)是从磁盘装载简单列表的最好选择。
最后,应考虑将数据的表示缓存在磁盘上,而不是数据本身。预先转换的 HTML 能够用 .htm 或 .asp 文档存储在磁盘上,终极链接能够直接指向这些文档。能够使用商用工具,如 XBuilder,或 Microsoft? SQL Server? Internet 发布功能将产生 HTML 的过程自动化。或,您能够将 HTML 代码片断放在 .asp 文档中。还能够使用 FileSystemObject 从磁盘读取 HTML 文档,或使用 XML 尽早转换。
技巧 4:避免将非敏捷的组件缓存在 Application 或 Session 对象中
尽管将数据缓存在 Application 或 Session 对象中是个好的做法,但缓存 COM 对象却有严重的陷阱。通常,人们倾向于将经常使用的 COM 对象缓存到 Application 或 Session 对象中。很遗憾,许多 COM 对象(包括任何以 Visual Basic 6.0 或更低版本编写的对象)当存储在 Application 或 Session 对象时,会引起严重的瓶颈。