版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Asp编码优化技巧8则 ASP(Active Server Page)是Microsoft公司推出的基于PWS(Personal Web Server)&IIS(Internet Information Server)平台的、基于ISAPI(InternetServiceAPI)原理的动态网页开发技术,目前日趋成熟完善。在这里仅就代码优化进行一些简单讨论。 1、声明VBScript变量 在ASP中,对vbscript提供了强劲的支持,能够无缝集成vbscript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与vbscript交互
2、的过程中,很多程序员也惯于不声明vbscript的变量,这样加重了服务器的解析负担,进而影响服务器的响应请求速度。 鉴于此,我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明。实现方法是在ASP程序行首放置% option explicit%。 2、对URL地址进行编码 在我们使用asp动态生成一个带参数URL地址并进行跳转时,在IE中解析很正常,但在NetScrape浏览时却有错误如下: HTTP Error 400 400 Bad Request Due to malformed syntax, the request could not be unders
3、tood by the server. The client should not repeat the request without modifications. 解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码,例子如下: % URL=xur.asp var1=username= & server.URLencode(xur) var2=&company= & server.URLencode(xurstudio) var3=&phone= & server.URLencode(021-186) response.redirect URL
4、& ? & var1 & var2 & var3 % 3、清空对象 当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为“nothing”释放对象占用内存。当年,我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS 。下面的代码使用数据库内容建立一个下拉列表。代码示例如下: % myDSN=DSN=xur;uid=xur;pwd=xur mySQL=select * from authors where AU_ID100 set conntemp=server.createobject(adodb.connection) conntemp.open
5、 myDSN set rstemp=conntemp.execute(mySQL) if rstemp.eof then response.write 数据库为空 response.write mySQL conntemp.close set conntemp=nothing response.end end if% %do until rstemp.eof % % rstemp.movenext loop rstemp.close set rstemp=nothing conntemp.close set conntemp=nothing % 4、使用字符串建立SQL查询 使用字符串来建立查
6、询并不能加快服务器的解析速度,相反,它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是,可以迅速发现程序问题所在,从而便利高效地生成程序。示例如下: %mySQL= select * mySQL= mySQL & from publishers mySQL= mySQL & where state=NY response.write mySQL set rstemp=conntemp.execute(mySQL) rstemp.close set rstemp=nothing % 5、使用case进行条件选择 在进行条件选择的时候,尽量使用cas
7、e语句,避免使用if语句。使用case语句,可以使程序流程化,执行起来也比if语句来的快。示例如下: % FOR i = 1 TO 1000 n = i Response.Write AddSuffix(n) & br NEXT % % Function AddSuffix(num) numpart = RIGHT(num,1) SELECT CASE numpart CASE 1 IF InStr(num,11) THEN num = num & th ELSE num = num & st END IF CASE 2 IF InStr(num,12) THEN num = num & th
8、 ELSE num = num & nd END IF CASE 3 IF InStr(num,13) THEN num = num & th ELSE num = num & rd END IF CASE 4 num = num & th CASE ELSE num = num & th END SELECT AddSuffix = num END FUNCTION % 6、使用adovbs.inc文件中定义的常量打开记录集 打开记录集时,可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在inetpubiissam
9、plesIISamples目录下面。下面列举几个常用的游标类型和锁定类型。 游标类型:adOpenFowardOnly游标只能向前;adOpenKeyset游标可向前或者向后,如一用户添加记录,新记录不会出现在记录集中;adOpenDynamic游标动态随意;adOpenStatic记录集不对其他用户造成的记录修改有所反映。 锁定类型:adLockReadOney不能修改记录集中的记录;adLockPessimistic在编辑一条记录时锁定它;adLockOptimstic调用记录集Update方法时才锁定记录;adLockBatchOpeimstic记录只能成批更新。 !-#INCLUDE
10、VIRTUAL=/ADOVBS.INC - % connectme=DSN=xur;uid=xur;pwd=xur sqltemp=select * from publishers where name=xur set rstemp=Server.CreateObject(adodb.Recordset) rstemp.open sqltemp, connectme, adOpenStatic,adLockOptimstic response.write rstemp.recordcount & records inbr & sqltemp rstemp.close set rstemp=no
11、thing % 7、避免在使用global.asa文件中进行对象定义 由于global.asa文件中的内容可以为站点内所有文件引用,无疑,在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义: %SUB application_onstart set application(theCONN)=server.createobject(adodb.connection) END SUB %; 这样就可以在站点任何代码中做类似引用: % mySQL=select * from publishers whe
12、re state=xur set rstemp=application(theconn).execute(mySQL) % 同样地,可以在session_onstart函数中创建记录集对象 %SUB session_onstart set session(rstemp)=server.createobject(adodb.recordset) END SUB % 然后在站点也面中进行如下引用: % mySQL=select * from publishers where state=xur set session(rstemp)=conntemp.execute(mySQL) % 但这样做的同
13、时也有很大的负面影响,由于Application和session变量都只有在关闭网站的时候才释放占用的资源,所以session参数会浪费大量不必要内存,而且此时application变量成为服务器性能的瓶颈。 解决方法:建立定义对象asp页面,在需要进行调用这些对象的页面上,引入这张asp页面。假设定义对象的asp页面名称为define.asp,则只要在对应asp页面中加入以下语句就能引入该页面。 !-#INCLUDE VIRTUAL=/define.asp - 在进行页面引进时,最好在待引进的asp文件中不要包含%LANGUAGE=VBSCRIPT%语句。因为在asp文件中,只能有一句由来定
14、义的脚本解析语言。 8、安全防护 asp提供了很好的代码保护机制,所有的asp代码都在服务器端执行而只返回给客户端代码执行结果。即便这样,在老版本的IIS中还可以在文件名后面家:$DATA来查看asp的源代码,这已经属于Web Server安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。 虽然在asp中建议引入文件以inc作为扩展名,在这里仍建议以asp作为引文件的扩展名。当这些代码在安全机制不好的Web Server上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在Web Server上,如果没有定义好解析某类型(比如inc)的动
15、态连接库时,该文件以源码方式显示。 不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立DSN(Date Source Name),而在进行数据库访问时直接访问该DSN。改进 ASP 应用程序中的字符串处理性能James MussonDeveloper Services, Microsoft UK 2003年3月 适用于:Microsoft? Active Server Pages?Microsoft Visual Basic?摘要:大多数 Active Server Pages (ASP) 应用程序都
16、要通过字符串连接来创建呈现给用户的 HTML 格式的数据。本文对几种创建此 HTML 数据流的方法进行了比较,在特定情况下,某些方法在性能方面要优于其他方法。本文假定您已经具备一定的 ASP 和 Visual Basic 编程方面的知识。 简介 编写 ASP 页面时,开发人员实际上是创建一个格式化的文本流,通过 ASP 提供的 Response 对象写入 Web 客户端。创建此文本流的方法有多种,而您选择的方法将对 Web 应用程序的性能和可缩放性产生很大影响。很多次,在我帮助客户优化其 Web 应用程序的性能时,发现其中一个比较有效的方法是更改 HTML 流的创建方式。本文将介绍几种常用技术
17、,并测试它们对一个简单的 ASP 页面的性能所产生的影响。 ASP 设计 许多 ASP 开发人员都遵循良好的软件工程原则,尽可能地将其代码模块化。这种设计通常使用一些包含文件,这些文件中包含对页面的特定不连续部分进行格式化生成的函数。这些函数的字符串输出(通常是 HTML 表格代码)可以通过各种组合创建一个完整的页面。某些开发人员对此方法进行了改进,将这些 HTML 函数移到 Visual Basic COM 组件中,希望充分利用已编译的代码提供的额外性能。尽管这种设计方法很不错,但创建组成这些不连续 HTML 代码组件的字符串所使用的方法将对 Web 站点的性能和可缩放性产生很大的影响,无论
18、实际的操作是在 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
19、( 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 字符串)实际上无法更改长度。这意味着每当字符串
20、长度更改时,内存中字符串的原始表示形式都将遭到破坏,而且将创建一个包含新字符串数据的新的表示形式:这将增加分配内存和解除分配内存的操作。当然,ASP 和 Visual Basic 已为您解决了这一问题,因此实际开销不会立即显现出来。分配内存和解除分配内存要求基本运行时代码解除各个专用锁定,因此需要大量开销。当字符串变得很大并且有大块内存要被快速连续地分配和解除分配时,此问题变得尤为明显,就像在大型字符串连接期间出现的情况一样。尽管这一问题对单用户环境的影响不大,但在服务器环境(例如,在 Web 服务器上运行的 ASP 应用程序)中,它将导致严重的性能和可缩放性问题。下面,我们回到上述代码片段:
21、此代码中要执行多少个字符串分配操作?答案是 16 个。在这种情况下,“&”运算符的每次应用都将导致变量 sHTML 所指的字符串被破坏和重新创建。前面已经提到,字符串分配的开销很大,并且随着字符串的增大而增加,因此,我们可以对上述代码进行改进。快捷的解决方案 有两种方法可以缓解字符串连接的影响,第一种方法是尝试减小要处理的字符串的大小,第二种方法是尝试减少执行字符串分配操作的数目。请参见下面所示的 WriteHTML 代码的修订版本。Function WriteHTML( Data ) Dim nRep For nRep = 0 to 99 sHTML = sHTML & ( vbcrlf _
22、 & & (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 & 后的内容外面加上了括号。这实际上是通过更改优先顺序,来减小大多数字符串连接操作中处理的字符串大小。在最初的代码示例中,A
23、SP 编译器将查看等号右边的表达式,并从左到右进行计算。结果,每次重复都要进行 16 个连接操作,这些操作针对不断增长的 sHTML 进行。在新版本中,我们提示编译器更改操作顺序。现在,它将按从左到右、从括号内到括号外的顺序计算表达式。此技术使得每次重复包括 15 个连接操作,这些操作针对的是不会增长的较小字符串,只有一个是针对不断增长的大的 sHTML。图 1 显示了这种优化方法与标准连接方法在内存使用模式方面的比较。图 1:标准连接与加括号连接在内存使用模式方面的比较 在特定情况下,使用括号可以对性能和可缩放性产生十分显著的影响,后文将对此进行进一步的说明。StringBuilder 我们
24、已经找到了解决字符串连接问题的快捷方法,在多数情况下,此方法可以达到性能和投入的最佳平衡。但是,如果要进一步提高构建大型字符串的性能,需要采用第二种方法,即减少字符串分配操作的数目。为此,需要使用 StringBuilder。StringBuilder 是一个类,用于维护可配置的字符串缓冲区,管理插入到此缓冲区的新文本片断,并仅在文本长度超出字符串缓冲区长度时对字符串进行重新分配。Microsoft .NET 框架免费提供了这样一个类 (System.Text.StringBuilder),并建议在该环境下进行的所有字符串连接操作中使用它。在 ASP 和传统的 Visual Basic 环境中
25、,我们无法访问此类,因此需要自行创建。下面是使用 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
26、 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
27、 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(
28、m_nGrowth MinimimGrowth, m_nGrowth, MinimimGrowth) m_nSize = m_nSize + nGrowth m_sText = m_sText & Space$(nGrowth) End If End Sub 将缓冲区大小调整到当前使用的大小 Private Sub Shrink() If m_nSize m_nPos Then m_nSize = m_nPos - 1 m_sText = RTrim$(m_sText) End If End Sub 添加单个文本字符串 Private Sub AppendInternal(ByVal Text
29、 As String) If (m_nPos + Len(Text) m_nSize Then Grow Len(Text) Mid$(m_sText, m_nPos, Len(Text) = Text m_nPos = m_nPos + Len(Text) End Sub 添加一些文本字符串 Public Sub Append(ParamArray Text() Dim nArg As Long For nArg = 0 To UBound(Text) AppendInternal CStr(Text(nArg) Next nArg End Sub 返回当前字符串数据并调整缓冲区大小 Pub
30、lic Function ToString() As String If m_nPos 0 Then Shrink ToString = m_sText Else ToString = End If End Function 清除缓冲区并重新初始化 Public Sub Clear() InitBuffer End Sub 此类中使用的基本原则是,在类级别将变量 (m_sText) 用作字符串缓冲区,并使用 Space$ 函数以空格字符填充此缓冲区以将其设置为特定的大小。如果要将更多文本与现有文本连接在一起,则在检查缓冲区的大小足以存放新文本后,使用 Mid$ 函数在正确位置插入文本。ToSt
31、ring 函数将返回当前存储在缓冲区中的文本,并将缓冲区的大小调整为能够容纳此文本的正确长度。使用 StringBuilder 的 ASP 代码如下所示:Function WriteHTML( Data ) Dim oSB Dim nRep Set oSB = Server.CreateObject( StringBuilderVB.StringBuilder ) 用大小和增长系数初始化缓冲区 oSB.Init 15000, 7500 For nRep = 0 to 99 oSB.Append , (nRep + 1), , _ Data( 0, nRep ), , _ Data( 1, nR
32、ep ), , _ Data( 2, nRep ), , _ Data( 3, nRep ), , _ Data( 4, nRep ), , _ Data( 5, nRep ), Next WriteHTML = oSB.ToString() Set oSB = Nothing End Function 使用 StringBuilder 需要一定的开销,因为每次使用此类时都必须创建它的实例,并且在创建第一个类实例时必须加载包含此类的 DLL。对 StringBuilder 实例进行额外方法调用时也需要开销。使用加括号的“&”方法时,StringBuilder 如何执行取决于多个因素,包括连接的
33、数目、要构建的字符串的大小以及选择的 StringBuilder 字符串缓冲区的初始化参数的性能。请注意,在多数情况下,将缓冲区中所需的空间量估计得略高一些要远远好于让其不断增长。 内置方法 ASP 包含一种非常快捷的创建 HTML 代码的方法,只需多次调用 Response.Write。Write 函数使用隐式优化的字符串缓冲区,此缓冲区能够提供非常优秀的性能特性。修改后的 WriteHTML 代码如下所示:Function WriteHTML( Data ) Dim nRep For nRep = 0 to 99 Response.Write Response.Write (nRep +
34、1) Response.Write Response.Write Data( 0, nRep ) Response.Write Response.Write Data( 1, nRep ) Response.Write Response.Write Data( 2, nRep ) Response.Write Response.Write Data( 3, nRep ) Response.Write Response.Write Data( 4, nRep ) Response.Write Response.Write Data( 5, nRep ) Response.Write Next E
35、nd Function 虽然这段代码很可能为我们提供最佳的性能和可缩放性,但在某种程度上已经破坏了封装,因为现在会将函数内部的代码直接写入 Response 流,所以调用代码丧失了一定程度的控制权。另外,移动此代码(例如,移入 COM 组件)将变得更加困难,因为此函数与 Response 流存在依赖关系。 测试 上面提到的四种方法分别通过一个简单的 ASP 页面(包含一个由虚拟字符串数组提供数据的单个表格)进行了测试。我们使用 Application Center Test? (ACT) 从单个客户端(Windows? XP Professional,PIII-850MHz,512MB RAM
36、)针对 100Mb/sec 网络中的单个服务器(Windows 2000 Advanced Server,双 PIII-1000MHz,256MB RAM)执行了测试。ACT 配置为使用 5 个线程,以模拟 5 个用户连接至网站时的负载。每个测试都包括 20 秒预热时间和随后的 100 秒负载时间,在负载期间创建了尽可能多的请求。 通过更改主表格循环中的重复次数,针对不同数目的连接操作重复运行测试,如 WriteHTML 函数中的代码片断所示。运行的每个测试都使用上文提到的四种不同的方法执行。 结果 下面的一系列图表显示了各种方法对整个应用程序吞吐量的影响,以及 ASP 页面的响应时间。通过这
37、些图表,我们可以了解应用程序支持的请求数目,以及用户等待页面下载至浏览器所需的时间。表 1:使用的连接方法缩写的说明方法缩写说明RESP内置 Response.Write 方法CAT标准连接(“&”)方法PCAT加括号的连接(“&”)方法BLDRStringBuilder 方法 在模拟典型 ASP 应用程序工作负荷方面,此测试与实际情况相差甚远,从表 2 中可以明显看到,即使重复 420 次,此页面仍不是特别大。现在很多复杂的 ASP 页面在这些数字上都是比较高的,设置有可能超出此测试范围的限制。表 2:测试示例的页面大小和连接数目重复次数连接数目页面大小(以字节为单位)152402,6673
38、04804,917457207,167609609,417751,20011,6671201,92018,5391802,88027,8992403,84037,2593004,80046,6193605,76055,9794206,72062,219图 2:吞吐量结果图 从图 2 的图表中可以看到,正如我们所预期的,多重 Response.Write 方法 (RESP) 在测试的整个重复测试范围中为我们提供了最佳的吞吐量。但令人惊讶的是,标准字符串连接方法 (CAT) 的下降如此巨大,而加括号的方法 (PCAT) 在重复执行 300 多次时性能依旧要好很多。在大约重复 220 次之处,字符串
39、缓存带来的性能提高超过了 StringBuilder 方法 (BLDR) 固有的开销,在这一点以上,在此 ASP 页面中使用 StringBuilder 所需的额外开销是值得的。图 3:响应时间结果图图 4:省略 CAT 的响应时间结果图 图 3 和图 4 中的图表显示了按“到第一字节的时间”测量的响应时间(以毫秒为单位)。因为标准字符串连接方法 (CAT) 的响应时间增加过快,所以又提供了未包括此方法的图表(图 4),以便分析其他方法之间的差异。有一点值得注意,多重 Response.Write 方法 (RESP) 和 StringBuilder 方法 (BLDR) 随重复次数的增加呈现一种
40、近似线性的增长,而标准连接方法 (CAT) 和加括号的方法 (PCAT) 则在超过一定的阈值之后开始迅速增加。 小结 本文着重讲述了如何在 ASP 环境中应用不同的字符串构建技术,这些内容同样适用于所有使用 Visual Basic 代码创建大型字符串的方案,例如手动创建 XML 文档。以下原则可以帮助您确定哪种方法最适合您的需要。 首先尝试加括号的“&”方法,尤其是在处理现有代码时。这种方法对代码结构的影响微乎其微,但您会发现应用程序的性能将显著增强,甚至会超出预定目标。 在不破坏所需的封装级别的情况下使用 Response.Write。使用此方法,可以避免不必要的内存内字符串处理,从而提供
41、最佳的性能。 使用 StringBuilder 构建真正大型或连接数目较多的字符串。 尽管您可能未看到本文所示的这种性能增长,但我已在真实的 ASP Web 应用程序中使用了这些技巧,只需要很少的额外投入就可以在性能和可缩放性方面获得很大的提高。 提高ASP性能的最佳选择ASP开发人员为了在他们的设计项目中获得更好的性能和可扩展性而不断努力。幸运地是,有许多书籍和站点在这方面提供了很好的建议。但是这些建议的基础都是从ASP平台工作的结构上所得出的结论,对实际获得的性能的提高没有量的测量。由于这些建议需要更加复杂的编码过程并降低了编码的可读性,开发人员就只能在看不到实际运行效果的情况下,独自衡量
42、为了提高他们ASP应用程序的性能是否值得付出这些代价。 本文分为两大部分,我将介绍一些性能测试结果,帮助开发人员来确定某一特定举措是否不仅对将来的项目来说是值得的,并且能够对原来的项目进行更新。在第一部分我将回顾一些ASP开发的基础性问题。在第二部分,将涉及一些最优化ADO函数,并将它们的结果与调用VB COM对象执行相同ADO函数的ASP页面进行比较。这些结果很让人开眼界,甚至有些时候是很令人吃惊的。 在本文中,我们将回答以下问题: * 将ASP生成的内容写入响应流中最有效的方法是什么? * 是否应该开启缓冲器? * 是否应该考虑向ASP代码中增加注释? * 是否应该为页面明确地设置默认语言
43、? * 如果不需要,是否应该关闭Session 状态? * 是否应该把脚本逻辑放在子程序和函数区中? * 使用包含文件有什么影响? * 执行错误处理时会施加什么样的负载? * 设置一个上下文处理是否对性能有影响? 所有测试都是用Microsoft的Web应用程序重点工具(WAST)来进行的,这是一个免费的工具,可以在这里找到。我用WAST创建了一个简单的test 脚本,反复调用下面所描述的ASP页面测试(每个超过70,000次)。反应的时间基于平均最后字节总时间(TTLB), 也就是从最初请求的时间到工具从服务器接收最后一位数据的时间。我们的测试服务器是一个Pentium 166,内存为196
44、MB,客户机为Pentium 450,内存为256MB。你也许会想这些机器的性能并不算很高级,但是不要忘了,我们并不是要测试服务器的容量,我们只是要测试服务器每次处理一个页面所用的时间。测试期间这些机器不做其它工作。WAST 测试脚本、测试报告以及所有的ASP测试页面都包含在ZIP文件中,你可以自己进行回顾和测试。 将ASP生成的内容写入响应流中最有效的方法是什么? 使用ASP的一个最主要原因是在服务器上生成动态内容。所以很明显,我们测试的起点是确定将动态内容发送到响应流中的最适合的方式。在多种选择中,有两个是最基本的:一是使用内联ASP标记,另一个是使用Response.Write 语句。
45、为测试这些选择,我们创建了一个简单的ASP页面,其中定义了一些变量,然后将它们的值插入表格中。虽然这个页面很简单也不是很实用,但它允许我们分离并测试一些单独的问题。 使用ASP内联标记 第一个测试包括使用内联ASP标记 %= x % ,其中x是一个已赋值的变量。到目前为止,这个方法是最容易执行的,并且它使页面的HTML部分保持一种易于阅读和维护的格式。 % OPTION EXPLICIT Dim FirstName Dim LastName Dim MiddleInitial Dim Address Dim City Dim State Dim PhoneNumber Dim FaxNumbe
46、r Dim EMail Dim BirthDate FirstName = John MiddleInitial = Q LastName = Public Address = 100 Main Street City = New York State = NY PhoneNumber = 1-212-555-1234 FaxNumber = 1-212-555-1234 EMail = BirthDate = 1/1/1950 % HTML HEAD TITLE Response Test / TITLE /HEAD BODY H1 Response Test
47、/H1 TABLE tr td b First Name: /b /td td %= FirstName % /td /tr tr td b Middle Initial: /b /td td %= MiddleInitial % /td /tr tr td b Last Name: /b /td td %= LastName % /td /tr tr td b Address: /b /td td %= Address % /td /tr tr td b City: /b /td td %= City % /td /tr tr td b State: /b /td td %= State %
48、 /td /tr tr td b Phone Number: /b /td td %= PhoneNumber % /td /tr tr td b Fax Number: /b /td td %= FaxNumber % /td /tr tr td b EMail: /b /td td %= EMail % /td /tr tr td b Birth Date: /b /td td %= BirthDate % /td /tr /TABLE /BODY /HTML /app1/response1.asp的完整代码 以前的最佳(反应速度) = 8.28 msec/page 在HTML的每一行使用
49、Response.Write 语句 许多比较好的学习文档建议避免使用前面的那种方法。其主要理由是,在输出页面和处理页面施加反应时间的过程中,如果web 服务器不得不在发送纯HTML和处理脚本之间进行转换,就会发生一种被称为上下文转换的问题。大部分程序员一听到这里,他们的第一反应就是将原始的HTML的每一行都包装在Response.Write函数中。 Response.Write( html ) Response.Write( head ) Response.Write( title Response Test /title ) Response.Write( /head ) Response.
50、Write( body ) Response.Write( h1 Response Test /h1 ) Response.Write( table ) Response.Write( tr td b First Name: /b /td td & FirstName & /td /tr ) Response.Write( tr td b Middle Initial: /b /td td & MiddleInitial & /td /tr ) /app1/response2.asp的片段 以前的最佳(反应速度) = 8.28 msec/page 反应时间 = 8.08 msec/page 差
51、= -0.20 msec (减少 2.4%) 我们可以看到,使用这种方法与使用内联标记的方法相比在性能上获得的收益非常小,这也许是因为页面给服务器装载了一大堆小的函数调用。这种方法最大的缺点是,由于现在HTML都嵌入脚本中,所以脚本代码变得更加冗长,更加难以阅读和维护。 使用包装函数 当我们试图使用Response.Write 语句这种方法时,最令人灰心的发现可能就是Response.Write 函数不能在每行的结尾处放置一个CRLF 。因此,当你从浏览器中阅读源代码时,本来布置得非常好的HTML,现在成了没有结束的一行。我想,你的下一个发现可能会更令你恐怖:在Response 对象中没有其姊
52、妹函数Writeln 。所以,一个很明显的反应就是为Response.Write 函数创建一个包装函数,以便给每一行都附加一个CRLF 。 writeCR( tr td b First Name: /b /td td & FirstName & /td /tr ) SUB writeCR(str) Response.Write(str & vbCRLF) END SUB /app1/response4.asp的片段 以前的最佳(反应速度)= 8.08 msec/page 反应时间= 10.11 msec/page 差 = +2.03 msec (增加 25.1%) 当然,由于这种方法有效地使函数调用次数加倍,其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西经济管理职业技术学院《儿童牙病学》2024-2025学年第二学期期末试卷
- 人工智能行业市场前景及投资研究报告:“人工智能+”产业发展机遇
- 网络预约出租汽车司机安全知识宣贯能力考核试卷含答案
- 湖盐制盐工岗前活动策划考核试卷含答案
- 诊断试剂生产工岗前岗中水平考核试卷含答案
- 变压器铁芯叠装工发展趋势强化考核试卷含答案
- 碳酸二甲酯装置操作工操作水平评优考核试卷含答案
- 石材开采工安全实操评优考核试卷含答案
- 水解酵母分离工标准化知识考核试卷含答案
- 甲壳类繁育工岗前深度考核试卷含答案
- 大学英语语法重点总结
- 2026年大学物理力学知识点精讲与习题试卷及答案
- 守正创新担使命凝心聚力启新程-校长在2026年春季学期全体教师开学大会上的讲话
- 教师招聘考试公共基础知识试题及答案
- 药房绿色通道制度规范
- 【语文】湖南省长沙市天心区赤岭路学校小学一年级上册期末试卷(含答案)
- 涉融资性贸易案件审判白皮书(2020-2024)-上海二中院
- 2026年枣庄科技职业学院单招职业适应性测试必刷测试卷含答案
- 2025年北京市2025年中考历史真题试卷(含答案解析)
- 2023年鲁迅美术学院附属中学(鲁美附中)中考招生语文数学英语试卷
- 热处理加工中心年加工10000吨金属构件项目可行性研究报告写作模板立项备案文件
评论
0/150
提交评论