在ASP 应用过程中改进串处理技术性能.docx
- 文档编号:2396876
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:27
- 大小:42.86KB
在ASP 应用过程中改进串处理技术性能.docx
《在ASP 应用过程中改进串处理技术性能.docx》由会员分享,可在线阅读,更多相关《在ASP 应用过程中改进串处理技术性能.docx(27页珍藏版)》请在冰豆网上搜索。
在ASP应用过程中改进串处理技术性能
查看完整版本:
在ASP应用过程中改进串处理技术性能
YinGuoLiXi2007-12-2820:
28
在ASP应用过程中改进串处理技术性能
外文资料翻译(不少于4000外文印刷字符)
1.所译外文资料:
①作者:
JamesMusson
②书名(或论文题目):
ImprovingStringHandlingPerformanceinASPApplications
③出版社(或刊物名称):
[url]
url=/library/en-us/dnasp/html/aspstrcatn.asp
④出版时间(或刊号):
March2003
⑤所译页码:
2.译成中文:
在ASP应用过程中改进串处理技术性能
JamesMusson DeveloperServices,MicrosoftUK
March2003
Appliesto:
Microsoft®ActiveServerPages® MicrosoftVisualBasic®
摘要:
大多数活跃的服务器页(ASP)应用依赖串联建立HTML格式化的数据然后被用户使用。
本文对各种创造HTML数据流的方法进行了比较,其中有一些在特定的情况下有更好的性能。
ASP和VisualBasic编程设计的方法被合理采用了。
(11打印页)
绪论
开发者编写ASP页,其实是在创造一串格式化正文通过ASP提供给网络客户。
你能使用多中不同的方法创造该正文,但是你所选择的方法网络应用的性能和可测量性有很大影响。
在帮助用户协调他们Web应用性能的许多场合中,我已经发现主要的获胜因素是那个改变HTML数据流的方式。
在本文,我将展示一些普通的技术并且测试他们对简单的ASP页的性能的影响。
ASP设计
很多ASP开发者已经遵循好的软件设计原则并且模块化他们的代码。
这种设计通常采取用某一页的部分离散的功能模块组成新页的形式。
线性输出由这些功能实现,通常是HTML代码表,然后能通过各种各样结合形式形成完整的一页。
一些开发者已经更深入一步研究并且把这些HTML函数作为VisualBasicCOM的组成部分,希望受益于额外的编译代码提供的执行性能。
虽然这是一个好的设计惯例,通过这种方法建立数据流对网络站点执行效率有较大影响。
不管现实操作执行是从ASP的包含文件还是VisualBasicCOM零部件。
数据串串联
考虑下列代码碎片取自WriteHTML函数。
命名数据的参数仅仅是一个数组包含一些需要被格式化成一个表结构的数据(数据从数据库返回,例如)。
FunctionWriteHTML(Data)
DimnRep
FornRep=0to99
sHTML=sHTML&vbcrlf_
&"
&Data(0,nRep)&"
&Data(1,nRep)&"
&Data(2,nRep)&"
&Data(3,nRep)&"
&Data(4,nRep)&"
&Data(5,nRep)&"
Next
WriteHTML=sHTML
EndFunction
这就是为什么很多ASP和VisualBasic开发者建造HTML代码。
包含在sHTML变量里的正文被返回给呼叫代码然后使用Response.Write给客户写信。
当然,这也能以相似代码表示直接嵌入网页而不使用WriteHTML的功能。
这条代码的问题在于ASP和VisualBasic使用的数据类型,BSTR或者基本数据流,实际上不能改变长度。
这表示每当数据流的长度被改变的时候,数据表示就被破坏,包含新数据类型的数据流随之产生:
这结果产生在存储器分配操作和存储器分离操作中。
当然,在ASP和VisualBasic这都由你管理,因此实际上的花费不显示在表面上。
分配和再分配存储器要求基础的运行期代码取出专有的锁,因此可能是昂贵的。
这在数据量很大并且大块的存储器需要连续快速的被分配时显得特别明显,在重级联线期间也是如此。
当这在一种单个的用户环境里不能提出主要的问题时,在服务器环境里例如在ASP申请在一个Web服务员上运行可能会引起严重的性能和可测量性问题。
因此回到上面的代码碎片:
多少数据分配在这里执行?
实际上答案是16。
在这种情况下每次对'&'的应用操作引起那些可变的sHTML比破坏和重建。
我已经提及到数据分配是昂贵的,随着数据的增加越来越明显;用这知识武装,我们能对上面的代码加以改进。
快速简单的解决方案
这里有两种方法减轻数据串联的影响,第1是为了想办法减少操作的数据流的大小,第2是想办法降低数据应用操作的数量。
看修订后WriteHTML代码,如下。
FunctionWriteHTML(Data)
DimnRep
FornRep=0to99
sHTML=sHTML&(vbcrlf_
&"
&Data(0,nRep)&"
&Data(1,nRep)&"
&Data(2,nRep)&"
&Data(3,nRep)&"
&Data(4,nRep)&"
&Data(5,nRep)&"
Next
WriteHTML=sHTML
EndFunction
乍一看很难认出前后代码之间的差别。
后一个有插入语在sHTML=sHTML&。
这实际上降低了数据流的大小通过改变数据串联的优先权的大小。
在原先的代码里ASP编译器将考虑表达式的等式右边并且从左到右评价它。
这结果在16级联操作中包括一直在增长的sHTML。
在新版本中,我们给编译器一个暗示以改变它执行操作的次序。
现在它将从左到右彻底的进行评价,即首先的内部插入语。
这技术导致15级联操作中包含小的数据流并且只有一个sHTML是增长的。
图1显示了这一个相对于标准串联方法而言的最优化级联方法。
串联
使用插入语在一定的情形下能使性能和可测量性有相当明显的差别,我将在本文中证明。
TheStringBuilder
我们已经知道了对于数据串联问题的最好解决方法,并且它还提供了很多很多情况下在性能和实现的努力之间的平衡。
然而,如果我们想要得到改进建造大数据流的性能,我们需要作出第2个选择,就是减少数据流分配的数量。
为了达到这个目的要求使用StringBuilder。
这是一个包含数据结构缓冲器和试图插入新内容的类,且只有在数据长度超过缓冲器的长度时才进行再分配。
微软.NET免费提供了一个被推荐在全部数据串联环境的类(System.Text.StringBuilder)。
在ASP和VisualBasic世界我们无法使用这种类,因此我们需要创造属于我们自己的。
以下是一个使用VisualBasic6.0开发的类StringBuilder(为了更简练我们忽略了处理错误的规则)。
OptionExplicit
'defaultinitialsizeofbufferandgrowthfactor
PrivateConstDEF_INITIALSIZEAsLong=1000
PrivateConstDEF_GROWTHAsLong=1000
' buffersizeandgrowth
Privatem_nInitialSizeAsLong
Privatem_nGrowthAsLong
' bufferandbuffercounters
Privatem_sTextAsString
Privatem_nSizeAsLong
Privatem_nPosAsLong
PrivateSubClass_Initialize()
' setdefaultsforsizeandgrowth
m_nInitialSize=DEF_INITIALSIZE
m_nGrowth=DEF_GROWTH
' initializebuffer
InitBuffer
EndSub
' settheinitialsizeandgrowthamount
PublicSubInit(ByValInitialSizeAsLong,ByValGrowthAsLong)
IfInitialSize>0Thenm_nInitialSize=InitialSize
IfGrowth>0Thenm_nGrowth=Growth
EndSub
' initializethebuffer
PrivateSubInitBuffer()
m_nSize=-1
m_nPos=1
EndSub
' growthebuffer
PrivateSubGrow(OptionalMinimimGrowthAsLong)
' initializebufferifnecessary
Ifm_nSize=-1Then
m_nSize=m_nInitialSize
m_sText=Space$(m_nInitialSize)
Else
' justgrow
DimnGrowthAsLong
nGrowth=IIf(m_nGrowth>MinimimGrowth,
m_nGrowth,MinimimGrowth)
m_nSize=m_nSize+nGrowth
m_sText=m_sText&Space$(nGrowth)
EndIf
EndSub
' trimthebuffertothecurrentlyusedsize
PrivateSubShrink()
Ifm_nSize>m_nPosThen
m_nSize=m_nPos-1
m_sText=RTrim$(m_sText)
EndIf
EndSub
' addasingletextstring
PrivateSubAppendInternal(ByValTextAsString)
If(m_nPos+Len(Text))>m_nSizeThenGrowLen(Text)
Mid$(m_sText,m_nPos,Len(Text))=Text
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在ASP 应用过程中改进串处理技术性能 ASP 应用 过程 改进 处理 技术 性能