快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时娱乐在线_龟发之家论坛



简介

编写 ASP 页面时,开拓职员实际上是创建一个款式化的文本流,经由过程 ASP 供给的 Response 工具写入 Web 客户端。创建此文本流的措施有多种,而您选择的措施将对 Web 利用法度榜样的机能和可缩放性孕育发生很大年夜影响。很多次,在我赞助客户优化其 Web 利用法度榜样的机能时,发明此中一个对照有效的措施是变动 HTML 流的创建要领。本文将先容几种常用技巧,并测试它们对一个简单的 ASP 页面的机能所孕育发生的影响。

ASP 设计

许多 ASP 开拓职员都遵照优越的软件工程原则,尽可能地将其代码模块化。这种设计平日应用一些包孕文件,这些文件中包孕对页面的特定不继续部分进行款式化天生的函数。这些函数的字符串输出(平日是 HTML 表格代码)可以经由过程各类组合创建一个完备的页面。某些开拓职员对此措施进行了改进,将这些 HTML 函数移到 Visual Basic COM 组件中,盼望充分使用已编译的代码供给的额外机能。

只管这种设计措施很不错,但创建组成这澳门24小时娱乐在线些不继续 HTML 代码组件的字符串所应用的措施将对 W澳门24小时娱乐在线eb 站点的机能和可缩放性孕育发生很大年夜的影响,无论实际的操作是在 ASP 包孕文件中履行照样在 Visual Basic COM 组件中履行。

字符串连接

请看以下 WriteHTML 函数的代码片断。名为 Data 的参数只是一个字符串数组,此中包孕一些要款式化为表格布局的数据(例如,从数据库返回的数据)。

Function WriteHTML( Data )

Dim nRep

For nRep = 0 to 99

sHTML = sHTML & vbcrlf _

& "

" & (nRep + 1) & "

" _

& Data( 0, nRep ) & "

" _

& Data( 1, nRep ) & "

" _

& Data( 2, nRep ) & "

" _

& Data( 3, nRep ) & "

" _

& Data( 4, nRep ) & "

" _

& Data( 5, nRep ) & ""

Next

WriteHTML = sHTML

End Function

这是很多 ASP 和 Visual Basic 开拓职员创建 HTML 代码时常用的措施。sHTML 变量中包孕的文本返回到调用代码,然后应用 Response.Write 写入客户端。当然,这还可以表示为直接嵌入不包孕 WriteHTML 函数的页面的类似代码。此代码的问题是,ASP 和 Visual Basic 应用的字符串数据类型(BSTR 或 Basic 字符串)实际上无法变动长度。这意味着每当字符串长度变动时,内存中字符串的原始表示形式都将遭到破坏,而且将创建一个包孕新字符串数据的新的表示形式:这将增添分配内存和解除分配内存的操作。当然,ASP 和 Visual Basic 已为您办理了这一问题,是以实际开销不会急速显现出来。分配内存和解除分配内存要求基础运行期间码解除各个专用锁定,是以必要大年夜量开销。当字符串变得很大年夜并且有大年夜块内存要被快速继续地分配和解除分配时,此问题变得尤为显着,就像在大年夜型字符串连接时代呈现的环境一样。只管这一问题对单用户情况的影响不大年夜,但在办事器情况(例如,在 Web 办事器上运行的 ASP 利用法度榜样)中,它将导致严重的机能和可缩放性问题。

下面,我们回到上述代码片段:此代码中要履行若干个字符串分配操作?谜底是 16 个。在这种环境下,“&”运算符的每次利用都将导致变量 sHTML 所指的字符串被破坏和从新创建。前面已经提到,字符串分配的开销很大年夜,并且跟着字符串的增大年夜而增添,是以,我们可以对上述代码进行改进。

快捷的办理规划

有两种措施可以缓解字符串连接的影响,第一种措施是考试测验减小要处置惩罚的字符串的大年夜小,第二种措施是考试测验削减履行字符串分配操作的数目。请拜见下面所示的 WriteHTML 代码的修订版本。

Function WriteHTML( Data )

Dim nRep

For nRep = 0 to 99

sHTML = sHTML & ( vbcrlf _

& "

" & (nRep + 1) & "

" _

& Data( 0, nRep ) & "

" _

& Data( 1, nRep ) & "

" _

& Data( 2, nRep ) & "

" _

& Data( 3, nRep ) & "

" _

& Data( 4, nRep ) & "

" _

& Data( 5, nRep ) & "" )

Next

WriteHTML = sHTML

End Function

乍一看,可能很难发明这段代码与上一个代码示例的区别。着实,此代码只是在 sHTML = sHTML & 后的内容外貌加上了括号。这实际上是经由过程变动优先顺序,来减小大年夜多半字符串连接操作中处置惩罚的字符串大年夜小。在最初的代码示例中,ASP 编译器将查看等号右边的表达式,并从左到右进行谋略。结果,每次重复都要进行 16 个连接操作,这些操作针对赓续增长的 sHTML 进行。在新版本中,我们提示编译器变动操作顺序。现在,它将按从左到右、从括号内到括号外的顺序谋略表达式。此技巧使得每次重复包括 15 个连接操作,这些操作针对的是不会增长的较小字符串,只有一个是针对赓续增长的大年夜的 sHTML。图 1 显示了这种优化措施与标准连接措施在内存应用模式方面的对照。

图 1:标准连接与加括号连接在内存应用模式方面的对照

在特定环境下,应用括号可以对机能和可缩放性孕育发生十分显明的影响,后文将对此进行进一步的阐明。

StringBuilder

我们已经找到了办理字符串连接问题的快捷措施,在多半环境下,此措施可以达到机能和投入的最佳平衡。然则,假如要进一步前进构建大年夜型字符串的机能,必要采纳第二种措施,即削减字符串分配操作的数目。为此,必要应用 StringBuilder。StringBuilder 是一个类,用于掩护可设置设置设备摆设摆设的字符串缓冲区,治理插入到此缓冲区的新文本片断,并仅在文本长度越过字符串缓冲区长度时对字符串进行从新分配。Microsoft .NET 框架免费供给了这样一个类 (System.Text.StringBuilder),并建议在该情况下进行的所有字符串连接操作中应用它。在 ASP 和传统的 Visual Basic 情况中,我们无法造访此类,是以必要自行创建。下面是应用 Visual Basic 6.0 创建的 S澳门24小时娱乐在线tringBuilder 类示例(为简洁起见,省略了差错澳门24小时娱乐在线处置惩罚代码)。

Option Explicit

' 默认的缓冲区初始大年夜小和增长系数

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, MinimimGrow澳门24小时娱乐在线th)

m_nSize = m_nSize + nGrowth

m_sText = m_sText & Space$(nGrowth)

End If

End Sub

' 将缓冲区大年夜小调剂到当前应用的大年夜小

您可能还会对下面的文章感兴趣: