找回密码
 入学

QQ登录

只需一步,快速开始

查看: 1912|回复: 2

如何提高asp的速度

[复制链接]
发表于 2006-7-1 14:41:15 | 显示全部楼层 |阅读模式
<DIV class="f14 wr">许多ASP程序员都有过执行数据库查询,然后将查询结果用HTML表格的形式显示出 <br>来的经 <br>历吧. 通常我们是这么做的: <br><br>&lt; % <br>“Create connection / recordset <br>“Populate data into recordset object <br>% &gt; <br><br>&lt; TABLE &gt; <br>&lt; % Do While not rs.EOF % &gt; <br>&lt; TR &gt; <br>&lt; TD &gt;&lt; %=rs("Field1")% &gt;&lt; /TD &gt; <br>&lt; TD &gt;&lt; %=rs("Field2")% &gt;&lt; /TD &gt; <br>. <br>&lt; /TR &gt; <br>&lt; % rs.MoveNext <br>Loop % &gt; <br>&lt; /TABLE &gt; <br><br>如果查询结果很多,服务器解释你的ASP script将花费大量的时间,因为有许多的 <br><br>Response.Write语句要处理. 如果你将输出的全部结果放在一个很长的字符串里 <br>(从&lt; <br>TABLE &gt;到&lt; /TABLE &gt;),那么服务器只需解释一遍Response.Write语句,速度就会 <br>快得多 <br>. 微软公司里的一些能干的家伙已经将想法变成了现实. (注意,这是一个ADO 2. <br>0才有 <br>的特性. 如果你还在使用ADO 1.5话,可以在 <br><a href="http://www.microsoft.com/data/download.htm" target="_blank" >http://www.microsoft.com/data/download.htm</A>免费下载ADO 2.0) <br><br>有了GetString方法,我们就可以仅用一个Response.Write来显示所有的输出了,它 <br>就象 <br>是能判断Recordset是否为EOF的DO ... LOOP循环. <br><br>GetString的用法如下(所有的参数都是可选的): <br><br>String = recordset.GetString(StringFormat, NumRows, ColumnDelimiter, <br>RowDelimiter, NullExpr) <br><br>要从Recordset的结果里生成HTML表格,我们只需关心GetString的5个参数中的3个 <br>: <br>ColumnDelimiter(分隔记录集的列的HTML代码),RowDelimiter(分隔记录集的行的 <br>HTML <br>代码),和NullExpr(当前记录为空时应生成的HTML代码). 就象你在下面生成HTML <br>表格的 <br>例子里所看到的那样,每列用&lt; TD &gt;...&lt; /TD &gt;分隔,每行用&lt; TR &gt;...&lt; /TR &gt;分 <br>隔. 来 <br>看看例子的代码吧. <br><br>&lt; %@ LANGUAGE="VBSCRIPT" % &gt; <br>&lt; % Option Explicit “Good coding technique <br><br>“Establish connection to DB <br>Dim conn <br>Set conn = Server.CreateObject("ADODB.Connection") <br>conn.Open "DSN=Northwind;" <br><br>“Create a recordset <br>Dim rs <br>Set rs = Server.CreateObject("ADODB.Recordset") <br>rs.Open "SELECT * FROM table1", conn <br><br>“Store our one big string <br>Dim strTable <br>strTable = rs.GetString(,,"&lt; /td &gt;&lt; td &gt;","&lt; /td &gt;&lt; /tr &gt;&lt; tr &gt;&lt; td &gt;" <br>," ") <br>% &gt; <br><br>&lt; HTML &gt; <br>&lt; BODY &gt; <br><br><br>&lt; TABLE &gt; <br>&lt; TR &gt;&lt; TD &gt; <br>&lt; % Response.Write(strTable) % &gt; <br>&lt; /TR &gt;&lt; /TD &gt; <br>&lt; /TABLE &gt; <br><br>&lt; /BODY &gt; <br>&lt; /HTML &gt; <br>&lt; % <br><br>“Cleanup! <br>rs.Close <br>Set rs = Nothing <br>conn.Close <br>Set conn = Nothing <br>% &gt; <br><br>strTable字符串用于存放我们从"SELECT * FROM table1"结果生成的HTML表格的 <br>代码. <br>HTML表格的每列之间都将有&lt; /td &gt;&lt; td &gt;的HTML代码,每行之间的HTML代码是&lt; <br>/td &gt;&lt; <br>/td &gt;&lt; tr &gt;&lt; td &gt;. GetString方法将输出正确的HTML代码并存放在strTable中 <br>,这样 <br>我们只需一行Response.Write便可以输出数据集中的所有记录. 让我们来看个简 <br>单的例 <br>子,假设我们的查询结果返回了以下的行和列: <br><br>Col1 Col2 Col3 <br>Row1 Bob Smith 40 <br>Row1 Ed Frank 43 <br>Row1 Sue Void 42 <br><br>那么GetString语句返回的字符串将是: <br><br>Bob&lt; /td &gt;&lt; td &gt;Smith&lt; /td &gt;&lt; td &gt;40&lt; /td &gt;&lt; td &gt;&lt; /td &gt;&lt; /tr &gt;&lt; tr &gt;&lt; <br>td <br>&gt;Ed ... <br><br>说实话,这个字符串看上去冗长而杂乱,但它就是我们想要的HTML代码. (注意看, <br>我们在 <br>手工书写的HTML代码中,将&lt; TABLE &gt;&lt; TR &gt;&lt; TD &gt;放在Response.Write的前面,将 <br>&lt; /TD <br>&gt;&lt; /TR &gt;&lt; /TABLE &gt;放在它的后面. 这是因为我们的格式化字符串中并不含有这 <br>些表格 <br>头尾所需的字符串.) <br><br></DIV>
[此贴子已经被作者于2006-7-1 6:58:14编辑过]

 楼主| 发表于 2006-7-1 14:41:26 | 显示全部楼层
<DIV class=f14>楼上的只能简化代码,不能起到优化速度的作用,getString()函数所做的,只是封装了这些代码,没有从根本解决速度问题,直接写在页面上也是一样的。 <BR><BR>说几个小经验,可以极大优化asp的速度,建议在页面调试完成后,即页面可以正常运行的时候开始优化,另外,优化方法可能会对你的页面的结构造成难阅读的情况,呵呵这可能是所有程序优化不可避免的。 <BR><BR>首先我们从原理来看一下: <BR>&lt;%...%&gt; <BR>.... <BR>&lt;%...%&gt; <BR>.... <BR>所有的asp代码会被包括在&lt;%%&gt;里面,而页面静态代码则直接写,在asp解释的过程中,直接写的由伺服器比如iis直接通过iisapi.dll输出,而&lt;%%&gt;里面包括的需要通过asp.dll来解释,执行后交给iisapi.dll来输出,在这2个库所在的进程中切换是非常耗时间的。所以,我们有了第一个优化方法:改成: <BR>&lt;% ... <BR>response.write("...") <BR>... <BR>response.write("...") <BR>%&gt; <BR>本来要切换进程3次,现在1次都不用切换就可以了,极端情况,1个页面全部是由&lt;%%&gt;包括起来的,所有静态代码全部用response.write()来封装,这个方法好处是可以极大优化代码速度,缺点是后期静态页面维护不好维护,如果静态页面代码和动态代码都是一个人写的,那么就不会有什么太大麻烦。 <BR><BR>再来看看数据库,通常我们会把connection写在一个文件中,每个需要调用的页面只要#include就可以使用了,有很多的人连recordset也写在里面,而这些会很容易忘记释放,我们要做的,就是在尽可能靠前的地方释放这些数据库对象,因为每个connection就会对数据库做一个连接,对于access这些没有连接池的数据库来说,大并发的网站会造成超高量的连接来堵塞数据通道,这个是在asp开发中经常碰到的,10几个人可以正常运行的网站,突然超过100人就不稳定的原因所在了。 </DIV>
回复

使用道具 举报

发表于 2009-4-10 09:26:20 | 显示全部楼层

不错,顶楼主..........

不错,顶楼主..........
















古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。---魔兽剑圣异界纵横
小游戏 极品家丁 龙蛇演义 恶魔法则 飞升之后 异界枪神 凡人修仙传 魔兽领主 超级农民 成人小游戏 极品公子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入学

本版积分规则

QQ|Archiver|手机版|小黑屋|校园天空成立于2004年2月24日 ( 陕ICP备08000078号-8 )

GMT+8, 2025-5-11 11:44 , Processed in 0.095950 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表