ASP 快速执行动态网页

这是一篇关于怎样精简代码和Asp 特征以获得最快执行速度的详细文章。对于一个急燥的用户来说,任何在按下用户按钮到结果出现在它们的屏幕之间的延迟可能意味着它们会转到浏览其它的站点?假如你的是商业站点,这有可能意味着失去潜在的销售。

我们没有任何办法控制用户的带宽,但我们的确能通过优化Asp 站点来获得最佳的*能。大部分潜在*能的提升是通过系统改变而不是紧缩代码,一个不合适的想法是,一旦遇到系统效率问题,就向系统**者提意见要其升级系统。

首先,哪个因素可能影响Asp的*能?很不幸,有很多因素?下面这些只是其中的一部分:

可用带宽

服务器上的处理器和其它硬件的速度

在服务器上运行的其它程序(比如象那些OpenGL屏幕保护程序!)

数据库连接模式,连接池,数据库系统本身(比如Oracle优于Sql Server,Sql server优于Access)

所使用的语言

存储过程优于行式Sql语句

使用编译组件而不是VB或JavaScript,好的Asp编程经验,比如错误处理等

一些以上的因素可能已经被有IIS 知识经验的开发者普遍留意到了,但其它的可能对于他们来说是十分复杂的问题。在这篇文章里, 将试着解释所有影响Asp*能的每个因素,让我们看一看那些在我们刮胡子的几毫秒内就能做到的主要事情。

ASP脚本大小

你是脚本页(还有其它页面)是不是比必须的长度要长?这是一开始执行就会降低Asp *能的东西。ASP 脚本在用来获取信息和格式化输出的时候是十分有用的,但脚本也是逐行解释执行,所以你的脚本越长,执行它的时间也就越长。

如果你的脚本很庞大,怎么做才能减少脚本的长度呢?这里有几点建议:

你可以将它们转换成服务器端组件,也就是说,做成VB动态链接库DLL或者通过先进的Windows编程语言或适当的COM 接口语言将它转换成未编译组件?并且在服务器端注册它们。有关的快速指南可以在

http://www.webdevelopersjournal.com/articles/activex_for_asp.html找到。对一个写得好的ActiveX 组件进行编译不但能大幅度提高*能,还可以保护你的软件(脚本),尤其当你将你的Asp站点发布在第三方主机上的时候。

因为脚本是逐行解释执行的,所以剔除多余的脚本或建立更高效率的脚本能够改进*能。如果你在单个Asp 文件中有数百行的代码,可能这样做你能很好地划分使用者,买卖和数据服务。事实上,如果你这样做,可能会找出一些冗余的代码:如果你需要输出几个表格,你可以编写一个通用函数来输出一个表格,只是多次调用它。

在讲述Asp 脚本的大小问题的时候,不得不提及包含文件的大小。当你使用一个包含文件的时候,整个包含文件被装入,当包含文件被包含的时候,相当于在Asp 文件本身写下那部分代码。因此,如果你在一个冗长的包含文件里定义了很多通用的方法和定义,要明白到在你包含该文件的时候,不管你要不要用到里面的每个方法和定义,它都是被整个装入的。ASP 缓存全部的展开代码,这会降低查找效率在这种情况下,包含文件必须被分割成更小的,模块化的文件。也要明白到包含文件被服务器视为单独的页面请求,使用太多的包含文件会影响下载时间。

<!-- #include file="Header.asp" -->

<!-- #include file="Footer.asp" -->

<SCRIPT language="vbscript" runat="server">

Sub Main()

WriteHeader

WriteBody

WriteFooter

End Sub

Sub WriteBody()

...

End Sub

Main?'调用过程Main

</SCRIPT>

假如你的脚本冗长的话,请使用Response.IsClientConnected。这意味着在客户端不再连接到服务器的时候,你的服务器CPU能避免循环等待。

<%

'检查客户端是否仍在连接

If Not Response.IsClientConnected Then

'仍然连接着,处理程序

Else

'断开

End If

%>

Interspersing ASP and HTML

每个人都这样做?当我们输出表格的时候,我们会在ASP 和HTML代码间转换,而这是一个不好的习惯。例如:

<HTML>

<BODY>

<%

Set MyConn = Server.CreateObject("ADODB.Connection")

MdbFilePath = Server.MapPath("sample.mdb")

MyConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MdbFilePath & ";"

SQL_query = "SELECT * FROM Friends"

Set RS = MyConn.Execute(SQL_query)

WHILE NOT RS.EOF

%>

<LI><%=RS("Name")%>: <A HREF="">Homepage</A>

<%

RS.MoveNext

WEND

%>

</BODY>

</HTML>

另一个普遍的例子是使用IF语句的时候:

<%

If Not Session("DBOpen") Then

%>

<H1>Database not connected</H1>

<%

Else

%>

<H1>Database open</H1>

<%

End If

%>

在这些情况下,脚本*能能通过将服务器端脚本写到一起来,而用Response.write产生Html代码来提高*能。比如:

<%

If not Session ("DBOpen") Then

Response.Write "<H1>Database not connected</H1>"

Else

Response.Write "<H1>Database open</H1>"

End If

%>

在大的脚本和很多脚本的情况下,你将能看到*能的提高。注意这里尽量避免了使用<%标记,这样就能提高*能,ASP不需在执行脚本的时候计算字符的Ascii码。

Session状态

无庸置疑地,在Asp中能够通过Session维持某个状态的能力是十分强大的特色。然而,它会影响你的*能。明显地,你的站点的可伸缩**变成了另一个问题,如果限制Session的使用的话。然而,session会为每个用户消耗服务器资源。

如果你不使用session 变量,或事实上你不必使用?使用隐藏表单域,在数据库中保存数据,查询字符串是不是其中的窍门?所以你应该禁止Session状态。你可以使用下面的声明禁止使用session:

@EnableSessionState = False

这样,ASP将不再检查session信息。

如果你不得不依赖于session状态,应该避免在session对象中存放大量的数据。IIS中的session在客户端的HTTP cookie可用的时候就会保持,导致被session占用的内存在session 终止或超时前一直被占用。这样,如果很多用户同时使用你的程序的时候,你的服务器资源可能会耗尽。

数据库访问

数据库访问是必须的麻烦?访问数据库将会激烈地减慢你的程序,但很显然,如果没有数据库,很多站点将变得毫无价值可言。但通过存储过程访问数据库来代替使用嵌入式Sql 语句,你可以提升潜在的*能。通过使用存储过程和ActiveX Data Objects (ADO),它们亦同样拥有良好的灵活*。尽可能从存储过程来输出数据。

确认你的数据库具有索引,因为这样能直接提高你的程序的效率。同样,尽量在你的数据库服务器运行更新统计(Update Statistics) 以帮助追踪你的数据分发,这样,你的数据库就能够基于这些信息来改造查询执行。注意一些数据库比如MS Access,是不是真正能在企业级程序中接受?SQL Sever 7.0或者Oracle是一个更好的赌注。

让SQL象它被设计的那样工作,它能count(统计),连接(join),排序(sort)和group 数据。当你能够写出一个查询语句来做这些东西的时候,就不要自己用其它语言来实现。

下面是一个统计所有列的最简单的语法:

SELECT count(*) FROM publishers WHERE state='NY'

如果你统计一个指定的列,你必须使用group by语句来分组该列,否则它不会工作:

SELECT count(city),city FROM publishers GROUP BY city

分类返回的数据:

SELECT * FROM TableName WHERE FieldName>50 OR FieldName<100 ORDER BY FieldName2, Field Name3

使用Odbc还是文件DSN连接数据库?使用快速的OLEDB Provider技术连接你的数据库而不是使用DSN连接。不再需要恳求你的ISP(或数据库**员/网管)为你建立一个系统DSN,当你移走Web文件的时候,亦不需要改变配置。

OLEDB 介于ODBC层和应用程序之间。在你的ASP 页面中,ADO介于ODEDB之上的“应用程序”。你的ADO调用首先被送到OLEDB,接着被送到ODBC层。然而,你可以直接连接到OLEDB 层,并且如果你这样做的话,你就能看到服务器端*能的提高。然而,怎样直接连接到OLEDB?

如果你使用SQLServer 7,使用下面的连接代码连接数据库:

strConnString = "DSN='';DRIVER={SQL SERVER};" & _

"UID=myuid;PWD=mypwd;" & _

"DATABASE=MyDb;SERVER=MyServer;"

最重要的参数是DRIVER=部分。如果你要绕过ODBC而使用通过使用OLEDB 连接SQL Server(这是更快的连接),请使用下面的语法:

strConnString ="Provider=SQLOLEDB.1;Password=mypassword;" & _

"Persist Security Info=True;User ID=myuid;" & _

"Initial Catalog=mydbname;" & _

"Data Source=myserver;Connect Timeout=15"

有什么不对的地方吗?

现在你可能会觉得有点奇怪:我们在这个新的连接方法中的要点是什么呢?为什么不使用标准DSN-less/System DSN途径?呵,根据Wrox 在他的著作《ADO 2.0 Programmer's Reference》中测试的结果表明,如果你使用OLEDB连接和DSN或者DSN-less连接方法比较,你会发现有下面的改进:

*能对比:

SQL Access

OLEDBDSNOLEDBDSN

连接时间:18?82?连接时间:62?99

查询1,000条记录时间:29005400查询1,000条记录时间: 100950

注释:这个结果在Wrox的《ADO 2.0 Programmer's Reference》一书的第232和233页可以查到。时间的单位是毫秒,查询1,000记录时间是通过服务器端游标计算出来的(当使用客户端游标的时候,OLEDB与DSN记录集的*能之间的差别不大)。

ASP译码问题:

尽可能在客户端确认用户输入来减少HTTP来回请求的数量。如果浏览器有支持JavaScript或其它脚本的能力,使用它们的力量以释放更多的服务器资源。

下面的VBScript运行于客户端浏览器,在提交到你的服务器之前,用来验证用户信息:

<SCRIPT LANGUAGE="VBScript">

<!--

Sub btnEnter_OnClick

Dim TheForm

Set TheForm = Document.MyForm

If IsNumeric(TheForm.Age.Value) Then

TheForm.submit

Else

Msgbox "Please enter a numerical age."

End if

End Sub

//-->

</SCRIPT>

<FORMmethod="POST" name=MyFormaction="myfile.asp">? Name: <INPUT typr="text" name="Name">

Age: <INPUT type="text" name="Age">

<INPUT type="button" name="btnEnter"value="Enter">

</FORM>

使用局部变量,避免使用全局变量。局部变量比全局变量更快地被Asp 脚本引擎存取,因为不需搜索整个名称域。避免改变数组定义。在第一次初始化的时候就简单分配足够的大小效率更高。在这种情况下,你可能会浪费一些内存,但你获得了速度的优势。在服务器负载重的时候这个技术是显然易见有效的。

如果你需要引用不一定要用到的对象,那么最好使用<OBJECT>标记而不是用 Server.CreateObject方法。 使用Server.CreateObject引起对象立即被建立,反之,<OBJECT>标记则不会这样立即建立对象如果使用<object>定义后不使用该对象,你不会浪费资源。

例如:下面的例子是一个使用<OBJECT>标记建立一个application-scope广告轮 Ad Rotator对象实

例:

<OBJECT runat=server scope=Application id=MyAds progid="MSWC.AdRotator">

</OBJECT>

在存储该Ad Rotator对象进Application后,你可以在任何程序的页面中用下面的语法访问该对象

<%=MyAds.GetAdvertisement("CustomerAds.txt") %>

打开'Option Explicit'开关。在VB和VBScript 中,你可以在没有显式声明的情况下使用变量。但打开这个选项可以鉴别用定义变量,这样可以很好地书写变量,并能帮助提高*能。未定义的局部变量会变慢,因为在建立它之前,名称空间必须被搜遍后才知道变量是否存在。摆脱它,使每个变量清楚地定义(先定义后使用)。

这是一个好习惯,it may trap typos, 这样更快。

除非你真正需要使用,否而不要使用Server.MapPath方法。如果你知道真实路径就使用真实路径。使用MapPath需要IIS找回现时服务器路径,这意味着得向服务器发一个特殊的请求,也就意味着降低了*能。另一个方法是将路径存放到局部变量中,在需要的时候使用,这样就不需要服务器多次查找。

检查你自己是怎么做的

你可以通过工具来测量你的系统*能,比如系统*能监视器,netMon和PerfMon。测试web*能可以用WCAT (Web Capacity Analysis Tool)。使用WCAT,你可以测试你的IIS服务器和网络配置响应各种各样的客户请求,数据或HTML页面的能力。这些测试结果能够被用来作为优化你的服务器和网络配置的指导。WCAT是专门设计用来估计Windows 2000中的因特网服务(或Windows NT)和IIS 能响应的客户工作量

(仿真)。为了得到更多的信息,请参阅IIS Resource Kit(资源工具包)。那里也有冗长的WCAT用户指南在MSDN在线Web sorkshop站点里面有一个下载链接。如果你认真对待你的Asp *能的话,务必取得该工具。

力求最优化应用程序*能,你的web 应用程序会运行更加顺畅。如果不是真正需要,就不要影响服务器的*能。

asp 用存储过程实现数据分页

 一、创建表 tiku_koushi

if exists (select * from dbo.sysobjects where id =

object_id(N'[dbo].[tiku_koushi]') and OBJECTPROPERTY

(id, N'IsUserTable') = 1)

drop table [dbo].[tiku_koushi]

GO

CREATE TABLE [dbo].[tiku_koushi] (

[id] [int] IDENTITY (1, 1) NOT NULL ,

[title] [varchar] (250) COLLATE

Chinese_PRC_CI_AS NULL ,

[list2_id] [char] (10) COLLATE

Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

  二、存储过程 sp_c

CREATE proc sp_c

@tablename varchar(50),

@title varchar(250),

@list2_id varchar(50)

as

if @tablename='tiku_koushi'

select count(*) from tiku_koushi where title like '%'+@title+'%' and list2_id=@list2_id

GO

 三、存储过程 sp_search_tiku

CREATE PROCEDURE sp_search_tiku

@tablename varchar(50),

@title varchar(250),

@list2_id varchar(10),

@pagesize int,

@page int

AS

if @tablename='tiku_koushi'

begin

declare @ks int

declare @str varchar(200)

set @ks=@pagesize*(@page-1)

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[temp_table91]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

begin

select * into temp_table91 from tiku_koushi where

title like '%'+@title+'%' and list2_id=@list2_id order

by id desc

set rowcount @pagesize

set @str='select * from temp_table91 where id not in

(select top '+str(@ks)+' id from temp_table91)'

execute(@str)

drop table temp_table91

end

end

GO

  四、search_koushi.asp

<!-- #include file="conn.asp" -->

<%

line=6

if request("page")="" then

page=1

else

page=request("page")

end if

if page<1 then

page=1

end if

title=trim(request("title"))

list2_id=trim(request("list2_id"))

set rs2=conn.execute("sp_c 'tiku_koushi','"&title&"','"&list2_id&"'")

pagecount=CInt(rs2(0)\line)

if(CInt(rs2(0)) mod line)=0 then

pagecount=pagecount

else

pagecount=pagecount+1

end if

if CInt(page)>=pagecount then

page=CInt(pagecount)

end if

str=""

str=str&"page="&page&"&title="&title&"&list2_id="&list2_id

set rs=conn.execute

("sp_search_tiku 'tiku_koushi','"&title&"','"&list2_id&"','"&line&"','"&CInt(page)&"'")

if rs.eof then

response.write "no record"

else

%>

<html>

<head>

<style type="text/css">

td{font-size:12px;}

a{text-decoration:none;}

</style>

<script language="javascript">

</script>

</head>

<body>

<table width="518" border="1" bordercolorlight="000000"

bordercolordark="#ffffff"

align="center" cellpadding="0" cellspacing="0">

<!--DWLayoutTable-->

<tr bgcolor=#dfdfdf>

<td width="454" align="center" height=24 valign="middle">口试题的题目</td>

<td width="63" align="center" valign="middle">删除</td>

</tr>

<% do until rs.eof %>

<tr height=22>

<td valign="middle">·<a href=void(0)"

onclick="window.open('editkoushi.asp?id=<%=rs("id")%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','','width=518

height=160 left=100')">

<%=rs("title")%></a></td>

<td align="center" valign="middle">删除</td>

</tr>

<%

rs.movenext

loop

%>

<tr align="left" valign="middle" bgcolor="efeff6"

height=22>

<td colspan="2" style="padding-left:6px;">

<a href="search_koushi.asp?page=<%=1%>&title=<%=title%>&list2_id=<%=list2_id%>">首页</a> <a

href="search_koushi.asp?page=<%=page-1%>&title=<%=title%>&list2_id=<%=list2_id%>">上一页</a> <a

href="search_koushi.asp?page=<%=page+1%>&title=<%=title%>&list2_id=<%=list2_id%>">下一页</a> <a

href="search_koushi.asp?page=<%=pagecount%>&title=<%=title%>&list2_id=<%=list2_id%>">末页</a>  

一共 <%=pagecount%> 页 当前页为: <%=page%>/<%=pagecount%> 页

  共有 <%=rs2(0)%> 条记录</td>

</tr>

</table>

</body>

</html>

<%

rs2.close

set rs2=nothing

rs.close

set rs=nothing

end if

%>

时间: 2024-10-14 18:37:09

ASP 快速执行动态网页的相关文章

ASP 快速执行动态网页_应用技巧

这是一篇关于怎样精简代码和Asp 特征以获得最快执行速度的详细文章.对于一个急燥的用户来说,任何在按下用户按钮到结果出现在它们的屏幕之间的延迟可能意味着它们会转到浏览其它的站点?假如你的是商业站点,这有可能意味着失去潜在的销售. 我们没有任何办法控制用户的带宽,但我们的确能通过优化Asp 站点来获得最佳的*能.大部分潜在*能的提升是通过系统改变而不是紧缩代码,一个不合适的想法是,一旦遇到系统效率问题,就向系统**者提意见要其升级系统. 首先,哪个因素可能影响Asp的*能?很不幸,有很多因素?下面

sql-用Dreaweavercs4+ASP+SQL2005的动态网页

问题描述 用Dreaweavercs4+ASP+SQL2005的动态网页 想用Dreaweaver做ASP动态网页,连接SQL2005数据库,请问我是用字符串连接还是用数据源名称? 本来我用数据源名称,可是设置好好IIS,定义系统dsn后,在Dreamweaver连接数据库小加号那选择数据源名称,可是数据源名称下拉菜单确什么都没有~~~ 如果用字符串连接是直接可以把代码写到网页里就行嘛,谢谢各位了

为什么ASP中执行动态SQL总报错误信息?提示语句语法错误_数据库相关

问:为什么ASP中执行动态SQL总报错误信息?提示语句语法错误 答: 有时候写ASP用conn.execute(sql)查询.更新.插入Access数据库数据时,明明正确的语句却往往会显示sql语句错误,相当恼火,特进行了归纳,可适当为字段添加"["."]"解决: 复制代码 代码如下: 例1:select * from a  如出现错误,可改为:select * from [a]  例2:UPDATE [user] SET password = '"&am

ASP实例:动态网页中常用的6个ASP程序

程序|动态|网页  1. 下面的代码演示了如何在服务端获取来自客户端浏览器中某一个图片的x,y坐标,注意input控件的类型是image类型. <form><Input Name="ImageMap" Type="Image" Src="http://www.webjx.com/htmldata/2007-06-14/ImageMap.jpg" Alt="Click Anywhere"></for

asp.net-关于动态网页显示与数据库的问题

问题描述 关于动态网页显示与数据库的问题 首先描述一下我的情况,我现在再做一个类似博客的网站,之前我一直使用html语言来编写网页,所以网页的布局基本都已经实现了,类似于这种效果,然后每一个板块我都实现了,通过html语言来实现的.但是我现在想要连接数据库,通过数据库动态实现标题.作者.内容.时间等信息的加载,不知道怎么做,所以百度了一下,目前的想法是手动将html控件转化为asp.net控件,然后链接数据库加载每一条信息,不知道能不能实现,大神们给个意见吧 解决方案 制作好模板可以用repea

ASP.NET动态网页制作初学者备忘录

asp.net|初学|动态|网页 一位ASP.net初学者学习过程中整理的备忘录,包括"打开新的窗口并传送参数,为按钮添加对话框,删除表格选定记录,删除表格记录警告"等等常见问题的解决方法. 1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open('*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"

动态网页制作:ASP、JSP、PHP三种技术比较

js|比较|动态|网页 目前,最常用的三种动态网页语言有ASP(Active Server Pages),JSP(JavaServer Pages),PHP (Hypertext Preprocessor). 简 介 ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的.互动的.高性能的WEB服务应用程序.ASP采用脚本语言VBScript(Java script)作为自己的开发语言. PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地

动态网页制作技术JSP与ASP的比较

js|比较|动态|网页|js 总的来讲,JavaSever PagesTM(JSP)和 微软的Active Sever Pages(ASP)在技术方面有许多相似之处.两者都是为基于WEB应用实现动态交互网页制作提供的技术环境支持.同等程度上来讲,两者都能够为程序开发人员提供实现应用程序的编制与自带组件设计网页从逻辑上分离的技术.而且两者都能够替代CGI使网站建设与发展变的较为简单与快捷. 尽管JavaSever Pages 技术和微软的Active Sever Pages在许多方面都有相似的,但

动态网页技术--CGI:ASP:JSP:PHP(4)

4.PHP技术 笔者对PHP最为熟悉,也用的最多.PHP----Hypertext Preprocessor(超文本预处理器),是一种易于学习和使用的服务器端脚本语言,是生成动态网页的工具之一.它是嵌入HTML文件的一种脚本语言.七语法大部分是从C,JAVA,PERL语言中借来,并形成了自己的独有风格:目标是让WEB程序员快速的开发出动态的网页.它是当今INTERNET上最为火热的脚本语言,只需要很少的编程知识你就能使用PHP建立一个真正交互的WEB站点. PHP是完全免费的,可以不受限制的获得