|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
asp可以使用微软的activeX 使得网页功能无比强大,不过安全性也较差,而且是基于的windows服务器,所以性能稳定性也一般法式|功能|字符串 简介
编写 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 使用法式)中,它将招致严重的功能和可缩放性成绩。
上面,咱们回到上述代码片断:此代码中要履行几何个字符串分派操作?谜底是 16 个。在这类情形下,“&”运算符的每次使用都将招致变量 sHTML 所指的字符串被损坏和从头创立。后面已提到,字符串分派的开支很大,而且跟着字符串的增大而增添,因而,咱们可以对上述代码停止改善。
快捷的处理计划
有两种办法可以减缓字符串联接的影响,第一种办法是测验考试减小要处置的字符串的巨细,第二种办法是测验考试削减履行字符串分派操作的数量。请拜见上面所示的 WriteHTML 代码的修订版本。
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
乍一看,能够很难发明这段代码与上一个代码示例的不同。其实,此代码只是在 sHTML = sHTML & 后的内容里面加上了括号。这实践上是经由过程更改优先按次,来减小大多半字符串联接操作中处置的字符串巨细。在最后的代码示例中,ASP 编译器将检查等号右侧的表达式,并从左到右停止盘算。了局,每次反复都要停止 16 个毗连操作,这些操作针对不休增加的 sHTML 停止。在新版本中,咱们提醒编译器更改操作按次。如今,它将按从左到右、从括号内到括号外的按次盘算表达式。此手艺使得每次反复包含 15 个毗连操作,这些操作针对的是不会增加的较小字符串,只要一个是针对不休增加的大的 sHTML。图 1 显示了这类优化办法与尺度毗连办法在内存利用形式方面的对照。
图 1:尺度毗连与加括号毗连在内存利用形式方面的对照
在特定情形下,利用括号可以对功能和可缩放性发生非常明显的影响,后文将对此停止进一步的申明。
StringBuilder
咱们已找到懂得决字符串联接成绩的快捷办法,在多半情形下,此办法可以到达功能和投入的最好均衡。然而,假如要进一步进步构建大型字符串的功能,需求采取第二种办法,即削减字符串分派操作的数量。为此,需求利用 StringBuilder。StringBuilder 是一个类,用于保护可设置装备摆设的字符串缓冲区,办理拔出到此缓冲区的新文本片段,并仅在文本长度超越字符串缓冲区长度时对字符串停止从头分派。Microsoft .NET 框架收费供应了如许一个类 (System.Text.StringBuilder),并建议在该情况下停止的一切字符串联接操作中利用它。在 ASP 和传统的 Visual Basic 情况中,咱们没法会见此类,因而需求自行创立。上面是利用 Visual Basic 6.0 创立的 StringBuilder 类示例(为简约起见,省略了毛病处置代码)。
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, MinimimGrowth)
m_nSize = m_nSize + nGrowth
m_sText = m_sText & Space$(nGrowth)
End If
End Sub
' 将缓冲区巨细调剂到以后利用的巨细
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; |
|