1、 1 外文资料翻译 (译文不少于 2000 汉字) 1所译外文资料: Improving String Handling Performance in ASP Applications 作者: James Musson 书名(或论文题目): 出 版 社(或刊物名称): Developer Services, Microsoft UK 出版时间(或刊号): March 2003 所译页码: 2译成中文: 提高字符串处理性能的 ASP 应用程序 摘要: 大多数的动态服务器主页( ASP)的应用软件依赖于字串串连建立的 HTML 格式数据,然后呈现给用户。本文通过用几种方法来创建此 HTML 数据流
2、来进行比较,在某种特定的情况下,得出哪种方法的性能是最好的。我们假设已经有了对 ASP 和 VB的合理正确的认识。( 11 页) 。 导言 开发者 在写 ASP 网页时,其实只是在 ASP 提供的对象上的 Web 客户建立一个流的格式文本。用户可以通过几种方式来建立这种文字流,但是用户所选的方法对网页应用程序的性能和规模化有着很大的影响。在我帮助客户优化 Web 应用程序性能的许多次实践中,我发现最主要还是得利于对改变 HTML 流的编写方法。在本文中我将介绍一些常用 的技术和测试对一个简单的 ASP 网页有什么样的影响。 技术设计 许多 ASP 的开发者都遵循好软件工程的原则并且在可能的情况
3、下,把代码模块化。这种设计通常采用许多子文件的形式,在一个网页中,这些子文件具有把特定的不连续部分模型化的函数。通过此函数的输出的字符串,通常形成 HTML 的表格编码,然后通过各种组合连接起来,建立一个完整的网页。一些开发商把这个作为一个平台,进一步把 HTML 函数嵌入到 Visual Basic COM 组件中,希望得益于已编译的这些代码所能提供的额外性能。 虽然这无疑是一个良好的设计实践,常用的建 立字符串的方法,形式的这些离散 HTML 代码组件对网站执行和规模有很大的关系(无论实际操作是从内部的 ASP 子文件还是一个 Visual Basic COM 组件中进行的)。 字串串连
4、取自一个叫 WriteHTML 函数 ( 功能) 的代码片段。参数指定的数据只是一排包含需要进行格式化成一个表结构的数据字符串(假如数据从一个数据库返回)。 Function WriteHTML( Data ) Dim nRep For nRep = 0 to 99 2 sHTML = sHTML & vbcrlf _ & & (nRep + 1) & _ & Data( 0, nRep ) & _ & Data( 1, nRep ) & _ & Data( 2, nRep ) & _ & Data( 3, nRep ) & _ & Data( 4, nRep ) & _ & Data( 5,
5、 nRep ) & Next WriteHTML = sHTML End Function 这是 ASP 和 Visual Basic 开发者创建的 HTML 代码典型的一种方法。例子中的sHTML 变量是返回调用代码,然后用 Response.Write 写 到客户上。当然,这也可以表示成相似的编码直接地植入到网页中,而不用间接地使用 WriteHTML 函数。此编码在实际中存在的问题是,字符串数据类型所使用的是 ASP 和 Visual Basic,所以 BSTR 不能真正改变长度。这意味着,每一次改变字符串的长度就会摧毁 内存 中这些原字符串数据,从而创建一个新的字符串数据:结果造成一个
6、内存分配操作和一个取消内存分配的操作。当然 ,在 ASP 和 Visual Basic ,这些都是为顾客之便,所以真正的代价并不是马上直观的体现出来。 内存的分配和取消分配需要潜在的运行时间编码去执行解除独立锁,所以代价很大。当字符串越来越大,一块快的记忆区被连锁着分配和取消分配时,这个代价的昂贵尤为明显了。在大量的字符串串联中情况也一样。在单一用户环境中,也许反应不出什么严重的问题;但是在一个服务器环境下,比如在 ASP 应用程序中运行一个网页服务器,就有可能造成严重的性能问题和可扩展性的问题。 因此,回到上面的代码片段:有多少字符串分配正在执行呢?事实上,答 案是 16。在这种情况下,每一
7、个操作符的运用,都会引起被 sHTML 指定的字符串摧毁和重建。我已经提到,字符串分配非常昂贵,而且随着字符串的增长而增长。利用这方面的知识,我们可以改进上面的代码段。 快速而简单的解决方案 有两种方式,可以减轻字串串连的影响。首先是尽量减小被操纵的字符串的大小;第二次是尽量减少字符串分配操作的执行。修订后的 WriteHTML 代码如下所示。 Function WriteHTML( Data ) Dim nRep For nRep = 0 to 99 sHTML = sHTML & ( vbcrlf _ & & (nRep + 1) & _ 3 & Data( 0, nRep ) & _ &
8、 Data( 1, nRep ) & _ & Data( 2, nRep ) & _ & Data( 3, nRep ) & _ & Data( 4, nRep ) & _ & Data( 5, nRep ) & ) Next WriteHTML = sHTML End Function 乍看之下很难分出这段编码片段和前一个编码片段的区别。这个只是在每一个sHTML=sHTML &之后添加了括弧号。这实际上是减少了在改变执行先后次序时需要操作的字符串联的大小。之前的样编码, ASP 编译器将会审视等号右边,并且仅仅从左到右的评估。 这样就导致每次都重复 16 个串联,每次重复也包括一直在增大的
9、 sHTML。在新版本中,我们给编码器一个暗示,在改变运算次序的同时也执行运算符号。现在,评估不仅从左到右,而且从里到外,既括弧内优先。这个技术使得每次重复 15 个一直在减小的字符串,处了一个是不断增大的,而且 sHTML 也是增大的。图 1 显示的是优化后的方法与原来标准串联方法的内存使用率的概念图。 在某些情况下,用括弧在性能和可扩展性上有很大差别,我将在本文后面示范。 图 1 标准串联与加上括弧号串联的内存使用的比较 The StringBuilder 我们已经见到解决字符串联快速而有简洁的方法,许多情况 下,这可能会是最好的权衡性能和执行效果的方法。如果我们要改进建立大字符串,不管怎样,我们都需要采取第二个选择, 既 减少一些字符串分配业务。为了实现这个目的, StringBuilder 是必需