编写 ASP 页面时,开辟人员实践上是创立一个格局化的文本流,经由过程 ASP 供应的 Response 对象写入 Web 客户端。创立此文本流的办法有多种,而您选择的办法将对 Web 使用法式的功能和可缩放性发生很大影响。良多次,在我匡助客户优化其 Web 使用法式的功能时,发明个中一个对照无效的办法是更改 HTML 流的创立体例。本文将引见几种经常使用手艺,并测试它们对一个复杂的 ASP 页面的功能所发生的影响。
ASP 设计
很多 ASP 开辟人员都遵守优秀的软件工程准绳,尽量地将其代码模块化。这类设计凡是利用一些包括文件,这些文件中包括对页面的特定不一连局部停止格局化生成的函数。这些函数的字符串输入(凡是是 HTML 表格代码)可以经由过程各类组合创立一个完全的页面。某些开辟人员对此办法停止了改善,将这些 HTML 函数移到 Visual Basic COM 组件中,但愿充实使用已编译的代码供应的额定功能。
虽然这类设计办法很不错,但创立构成这些不一连 HTML 代码组件的字符串所利用的办法将对 Web 站点的功能和可缩放性发生很大的影响,不管实践的操作是在 ASP 包括文件中履行仍是在 Visual Basic COM 组件中履行。
字符串联接
请看以下 WriteHTML 函数的代码片段。名为 Data 的参数只是一个字符串数组,个中包括一些要格局化为表格布局的数据(例如,从数据库前往的数据)。
Function WriteHTML( Data )
Dim nRep
For nRep = 0 to 99
sHTML = sHTML & vbcrlf _
& "<TR><TD>" & (nRep + 1) & "</TD><TD>" _
& Data( 0, nRep ) & "</TD><TD>" _
& Data( 1, nRep ) & "</TD><TD>" _
& Data( 2, nRep ) & "</TD><TD>" _
& Data( 3, nRep ) & "</TD><TD>" _
& Data( 4, nRep ) & "</TD><TD>" _
& Data( 5, nRep ) & "</TD></TR>"
Next
WriteHTML = sHTML
End Function
这是良多 ASP 和 Visual Basic 开辟人员创立 HTML 代码经常用的办法。sHTML 变量中包括的文本前往到挪用代码,然后利用 Response.Write 写入客户端。固然,这还可以暗示为直接嵌入不包括 WriteHTML 函数的页面的相似代码。此代码的成绩是,ASP 和 Visual Basic 利用的字符串数据类型(BSTR 或 Basic 字符串)实践上没法更改长度。这意味着每当字符串长度更改时,内存中字符串的原始暗示模式都将遭到损坏,并且将创立一个包括新字符串数据的新的暗示模式:这将增添分派内存息争除分派内存的操作。固然,ASP 和 Visual Basic 已为您处理了这一成绩,因而实践开支不会当即展现出来。分派内存息争除分派内存请求根基运转时期码消除各个公用锁定,因而需求大批开支。当字符串变得很大而且有大块内存要被疾速一连地分派息争除分派时,此成绩变得尤其分明,就像在大型字符串联接时代呈现的情形一样。虽然这一成绩对单用户情况的影响不大,但在办事器情况(例如,在 Web 办事器上运转的 ASP 使用法式)中,它将招致严重的功能和可缩放性成绩。
' 默许的缓冲区初始巨细和增加系数
Private Const DEF_INITIALSIZE As Long = 1000
Private Const DEF_GROWTH As Long = 1000
' 缓冲区巨细和增加
Private m_nInitialSize As Long
Private m_nGrowth As Long
' 缓冲区弛缓冲区计数器
Private m_sText As String
Private m_nSize As Long
Private m_nPos As Long
Private Sub Class_Initialize()
' 设置巨细和增加的默许值
m_nInitialSize = DEF_INITIALSIZE
m_nGrowth = DEF_GROWTH
' 初始化缓冲区
InitBuffer
End Sub
' 设置初始巨细和增加数目
Public Sub Init(ByVal InitialSize As Long, ByVal Growth As Long)
If InitialSize > 0 Then m_nInitialSize = InitialSize
If Growth > 0 Then m_nGrowth = Growth
End Sub
' 初始化缓冲区
Private Sub InitBuffer()
m_nSize = -1
m_nPos = 1
End Sub
' 增大缓冲区
Private Sub Grow(Optional MinimimGrowth As Long)
' 初始化缓冲区(若有需要)
If m_nSize = -1 Then
m_nSize = m_nInitialSize
m_sText = Space$(m_nInitialSize)
Else
' 只是增加
Dim nGrowth As Long
nGrowth = IIf(m_nGrowth > MinimimGrowth,
m_nGrowth, MinimimGrowth)
m_nSize = m_nSize + nGrowth
m_sText = m_sText & Space$(nGrowth)
End If
End Sub