二十八条改善 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
请参见 World's 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 对象时,会引起严重的瓶颈。
查看所有0条评论>>