|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
简 介 性能是一个特性。您需要预先设计性能,或是在日后重新编写应用程序。换句话说,什么是最大限度优化 Active Server Pages (ASP) 应用程序性能的好策略? 本文为优化 ASP 应用程序和“Visual Basic(R) 脚本编辑器 (VBScript)”提供了许多技巧。对许多陷阱和缺陷进行了讨论。本文所列的建议均在 http://www.microsoft.com 及其他站点上进行了测试,而且工作正常。本文假定您对 ASP 开发有基本的理解,包括对 VBScript 和/或 JScript、ASP Application、ASP Session 和其他 ASP 内部对象(哀求、响应和服务器)。 ASP 的性能,通常不止取决于 ASP 代码本身。我们并不想在一篇文章中囊括所有的至理名言,只在最后列出与性能相关的资源。这些链接包括 ASP 和非 ASP 主题,包括“ActiveX(R) 数据对象 (ADO)”、“部件对象模型 (COM)”、数据库和“Internet 信息服务器 (IIS)”配置。这些是我们喜欢的链接 - 务请关注它们。 技巧 1:在 Web 服务器上缓存常用数据 典型的 ASP 页从后端数据库检索数据,然后将结果转变为超文本标记语言 (HTML)。无论数据库的速度如何,从内存检索数据要比从后端数据库检索数据快得多。从本地硬盘读取数据通常也要比从数据库检索数据快得多。因此,通常可以通过在 Web 服务器(在内存或磁盘)上缓存数据来改善性能。 缓存是典型的空间与时间的折衷。假如恰当地缓存数据,您将看到性能会有惊人的提高。为使缓存发挥效力,它必须保持常常重用的数据,而且重新计算这些数据的代价是昂贵的或比较昂贵的。假如缓存布满了垃圾数据,则是对存储器的浪费。 不常常变化的数据也是缓存的候选数据,因为您无须担心数据与数据库的同步问题。组合框、引用表、DHTML 碎片、可扩展标记语言 (XML) 字符串、菜单项和站点配置变量(包括数据源名称 (DSN)、Internet 协议 (IP) 地址和 Web 路径)都是缓存的候选数据。注重,您可以缓存数据的表示而不是数据本身。假如 ASP 页不常常更改,而且缓存的成本也异常高(例如,整个产品目录),请考虑预先生成 HTML,而不是在每次哀求时重新绘制。 数据应缓存在何处,有哪些缓存策略?数据常常缓存在 Web 服务器内存或 Web 服务器磁盘上。下面两个技巧讨论这些选项。 技巧 2:在 Application 或 Session 对象中缓存常用数据 ASP Application 和 Session 对象为在内存中缓存数据提供了方便的容器。既可以将数据赋予 Application 对象,也可将数据赋予 Session 对象,这些数据在 HTTP 调用中将保留在内存中。Session 数据按用户存储,而 Application 数据在所有用户间共享。 何时将数据载入 Application 或 Session?通常,在 Application 或 Session 启动时加载数据。要在 Application 或 Session 启动时加载数据,请在下面两函数中添加相应的代码:Application_OnStart() 或 Session_OnStart()。这两个函数应该位于 Global.asa;假如没有,可以添加这些函数。也可以在第一次需要数据时加载数据。要进行上述操作,请在 ASP 页中添加一些代码(或编写可重用的脚本函数),这些代码检查数据是否存在,并在数据不存在时加载数据。这是称为迟缓计算的经典性能技术的例子 - 在您的确需要它之前,不进行计算。请看例子: <% Function GetEmploymentStatusList Dim d d = Application("EmploymentStatusList") If d = "" Then \\\' FetchEmploymentStatusList 函数(不显示) \\\' 从 DB 中取出数据,返回数组 d = FetchEmploymentStatusList() Application("EmploymentStatusList") = d End If GetEmploymentStatusList = d End Function %> 可以为每一块所需的数据编写类似的函数。 数据应该以什么格式存储?任何变量类型均可存储,因为所有脚本变量是各不一样的。例如,可以存储字符串、整型或数组。通常,您将以这些变量类型之一存储 ADO 记录集的内容。若要获取 ADO 记录集衍生的数据,可以手工将数据复制到 VBScript 变量中,每次一个字段。使用一个 ADO 记录集保留函数 GetRows()、GetString() 或 Save() (ADO 2.5),会更快更简便。完整而具体的内容已超出了本文的范围。下面的演示函数使用了 GetRows() 来返回记录集数据的数组: \\\' 取记录集,以数组返回 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 对上面示例的进一步改进应当是缓存该列表的 HTML,而不是缓存数组。下面是一个简朴的范例: \\\' 取记录集,以“HTML 选项”列表返回 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 \\\' 参见尽早释放 FetchEmploymentStatusList = s \\\' 以字符串返回数据 End Function 在正常的情况下,可以在 Application 或 Session 作用域中缓存 ADO 记录集本身。有两个警告: ADO 必须为标记的自由线程 必须使用断开连接的记录集。 假如不能保证满意这两个要求,请不要缓存 ADO 记录集。在下面的非灵活组件和不要缓存连接技巧中,我们将讨论在 Application 或 Session 作用域中存储 COM 对象的危险。 假如在 Application 或 Session 作用域中存储数据,这些数据将一直保留在那儿,直到在程序中改变它、Session 过期或 Web 应用程序重新启动时为止。数据需要更新如何处理?若要用手工强制更新应用程序数据,可以调用只答应治理员访问的数据更新 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 \\\' 注重:此处可能有两个或多个调用。这是可以的,只不过 \\\' 产生几个不必要的取指令罢了(就此有一个工作区) \\\' FetchEmploymentStatusList 函数(不显示) \\\' 从 DB 中取数据,返回一个数组 d = FetchEmploymentStatusList() \\\' 更新 Application 对象。用 Application.Lock() \\\' 来确保一致的数据 Application.Lock Application("EmploymentStatusList") = d Application("LastUpdate") = CStr(Now) Application.Unlock End If End Sub %> 其他示例,请参阅具有 Application 数据的最快列表框(英文)。 请注重,在 Session 或 Application 对象中缓存大型数组并非上策。在访问数组元素之前,脚本语言的语法要求建立整个数组的临时副本。例如,假如在 Application 对象中缓存了将美国邮政编码映射到本地气象站的字符串数组,该字符串数组有 100,000 个元素,ASP 在找出一个字符串之前,必须将所有 100,000 个气象站复制到临时数组中。在这种情况下,建立带自定义方式的自定义组件,来存储气象站 - 或使用一个字典组件,也许更好。 请不要在倒洗澡水时把孩子一同倒掉,对这种观点的一个新的注解是:数组提供了对内存中相邻要害-数据对的迅速查找和存储。索引字典比索引数组要慢。您应该根据详细情况选择能够提供最佳性能的数据结构。 返回类别: 教程 上一教程: ASP进阶之文章在线治理更新(1) 下一教程: ASP字符串函数大全 您可以阅读与"ASP技巧集锦(官方权威版)-1"相关的教程: · ASP技巧集锦(官方权威版)-7 · ASP技巧集锦(官方权威版)-6 · ASP技巧集锦(官方权威版)-4 · ASP技巧集锦(官方权威版)-3 · ASP技巧集锦(官方权威版)-7 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |