对于ASP的初学者来说,最重要的是如何用 ASP 实现所需的功能。而对于那些已经入门,成功地将传统的C/S模式转为B/S模式的人来说,他们则关心如何才能使代码更有效,而不仅仅满足于实现了某个功能。代码优化,涉及到很多方面:数据库设计,数据访问方法,程序设计,对ASP掌握的熟练程度等等。可以说,对各种知识掌握的程度,决定了代码优化所能达到的程度。需要特别说明的是:优化的代码并非是运行最快的代码(通常情况下是)。速度只是衡量代码好坏的标准之一。优化的过程是各种标准综合权衡的过程。不过,本文讨论更多的是速度,因为它最直观。
本文分三部分:代码优化,数据访问优化,系统优化。代码优化包括组件的使用,包含文件的使用等等。
1. 不要在 Application 和 Session 中存储对象。
请看如下代码:
globe.asa
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
Application("ConnectString") = "driver={SQL Server};server=.;uid=sa;pwd=;database=pubs"
End Sub
Sub Session_OnStart
On Error Resume Next
Dim cnn
Set cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open Application("ConnectString")
Session("connectObj") = cnn
End Sub
......
......
Dim rs
Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT * FROM Authors ORDER BY au_lname"
rs.Open strSQL,Session("ConnectObj")
.....
这是有开发 C/S 系统经验的初学者常犯的错误,他的理由是:"我过去开发 C/S 系统时,对数据库来说一个 client 就是一个连接,类似 ASP 里的 Session。所以,把 Connection 对象放在 Session 中,会加快对数据库的访问。"
真的是这样吗?
把 Connection 对象放在 Session 中会引起一系列问题:资源的争用和消耗。( 参见文章: 组件,线程, ASP的性能 ) 应将对象从 Session 中清理出去,在页面级创建和释放对象。
2. 把常用的数据存放在 Application 中
假设你用 ASP 实现调查表的功能,其中有一项是让用户从城市的下拉列表中选择城市名,对于这种经常使用而且相对稳定的数据应将它放在 Application 中。通常会在 Application_OnStart 中进行初始化。不过,有时我们可能没有权限使用 global.asa ,没关系,可以采用下面的代码:
Dim var
var = Application("var")
If var = "" Then
var = GetFrequentlyUsedData() '函数GetFrequentlyUsedData()返回常用的数据,比如城市名称。
Application.Lock
Application("var") = var
Application.Unlock
End If
更好的方法是存储 HTML 格式的数据。假设上面的函数GetFrequentlyUsedData()以数组的形式返回城市名称。我们可以这样做:
Dim var
Dim s
Dim intLoop,intMax
var = Application("var")
If var = "" Then
var = GetFrequentlyUsedData() '函数GetFrequentlyUsedData()返回常用的数据,比如城市名称。
s = "<SELECT NAME=city>" & vbCrlf
intMax = UBound(var)
For intLoop = 0 To intMax
s = s & "<OPTION>" & var[intLoop] & "</OPTION>" & vbCrlf
Next
s = s & "</SELECT>"
Application.Lock
Application("var") = s
Application.Unlock
End If
特别强调的一点就是这种方法只适用于少量数据,否则会使服务器的性能大大下降。另外,谨防恶意使用 Application 变量的人。
我们经常把数据库连接字符串存储在 Application 中,这是个好方法,好就好在能保证每次与数据库连接时使用完全相同的连接条件,这是连接重用的前提。( 参见文章: 让数据库的连接更有效 ) 在下一篇中,我会再次讲到有关数据库连接的问题。
3. 把大数据存放在 Web Server 的磁盘上。
从后台数据库检索数据通常比从文件中检索要快,这只是对于请求一次页面来说,在点击次数很大的情况下,由于将数据保存在本地文件中,从而减轻了数据库服务器的负担,性能反而比从数据库检索好。
典型的例子就是用 ADO 的 Save 方法将结果集存储在本地。
4. 把 HTML 标记改为 Response.Write 成批输出。
效果会怎样呢?我们可以测试一下。
代码1
<HTML>
<HEAD>
<TITLE>Test</TITLE>
</HEAD>
<BODY>
<H1>Test</H1>
<%
Dim rs
Dim strSQL
Dim cnn
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=.;initial catalog=pubs;user id=sa;password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM Authors ORDER BY au_lname"
rs.Open strSQL,cnn
%>
<TABLE BORDER=1>
<TR>
<TD><B>au_id</B></TD>
<TD><B>au_lname</B></TD>
<TD><B>au_fname</B></TD>
<TD><B>phone</B></TD>
<TD><B>address</B></TD>
<TD><B>city</B></TD>
<TD><B>state</B></TD>
<TD><B>zip</B></TD>
</TR>
<%
Do While not rs.Eof
%>
<TR>
<TD><%=rs("au_id")%></TD>
<TD><%=rs("au_lname")%></TD>
<TD><%=rs("au_fname")%></TD>
<TD><%=rs("phone")%></TD>
<TD><%=rs("address")%></TD>
<TD><%=rs("city")%></TD>
<TD><%=rs("state")%></TD>
<TD><%=rs("zip")%></TD>
</TR>
<%
rs.MoveNext
Loop
%>
</TABLE>
</BODY>
</HTML>
Click! 测试上面的代码 (注意:此代码从数据库中检索数据,如果是第一次连接,测试时间会长些。多测试几遍,取其稳定值。)
代码2
<%
Response.Write "<HTML><HEAD><TITLE>Test</TITLE>" &_
"</HEAD><BODY><H1>Test</H1>"
Dim rs
Dim strSQL
Dim cnn
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=.;initial catalog=pubs;user id=sa;password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM Authors ORDER BY au_lname"
rs.Open strSQL,cnn
Response.Write "<TABLE BORDER=1><TR><TD><B>au_id</B></TD><TD><B>au_lname</B></TD>" &_
"<TD><B>au_fname</B></TD><TD><B>phone</B></TD><TD><B>address</B></TD>" &_
"<TD><B>city</B></TD><TD><B>state</B></TD><TD><B>zip</B></TD></TR>"
Do While not rs.Eof
Response.Write "<TR><TD>" & rs("au_id") & "</TD><TD>" & rs("au_lname") & "</TD>" &_
"<TD>" & rs("au_fname") & "</TD><TD>" & rs("phone") & "</TD>" &_
"<TD>" & rs("address") & "</TD><TD>" & rs("city") & "</TD>" &_
"<TD>" & rs("state") & "</TD><TD>" & rs("zip") & "</TD>"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
Response.Write "</TABLE></BODY></HTML>"
%>
Click! 测试上面的代码 (注意:此代码从数据库中检索数据,如果是第一次连接,测试时间会长些。多测试几遍,取其稳定值。)
有答案了吗?在我的机器上测试,用 HTML 标记的代码(代码1)需要 60~70ms,用 Response.Write 的代码(代码2)需要 40~50ms。
用 WAST 测试,结果分别为 TTLB:63.11ms 和 TTLB:47.50ms。
5. 不要在循环中连接字符串
<%
Dim str
str = "<HTML><HEAD><TITLE>Test</TITLE>" &_
"</HEAD><BODY><H1>Test</H1>"
Dim rs
Dim strSQL
Dim cnn
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=.;initial catalog=pubs;user id=sa;password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM Authors ORDER BY au_lname"
rs.Open strSQL,cnn
str = str & "<TABLE BORDER=1><TR><TD><B>au_id</B></TD><TD><B>au_lname</B></TD>" &_
"<TD><B>au_fname</B></TD><TD><B>phone</B></TD><TD><B>address</B></TD>" &_
"<TD><B>city</B></TD><TD><B>state</B></TD><TD><B>zip</B></TD></TR>"
Do While not rs.Eof
str = str & "<TR><TD>" & rs("au_id") & "</TD><TD>" & rs("au_lname") & "</TD>" &_
"<TD>" & rs("au_fname") & "</TD><TD>" & rs("phone") & "</TD>" &_
"<TD>" & rs("address") & "</TD><TD>" & rs("city") & "</TD>" &_
"<TD>" & rs("state") & "</TD><TD>" & rs("zip") & "</TD>"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
str = str & "</TABLE></BODY></HTML>"
Response.Write str
Click! 测试上面的代码 (注意:此代码从数据库中检索数据,如果是第一次连接,测试时间会长些。多测试几遍,取其稳定值。)
WAST 测试结果:TTLB:90.95。
6. 利用 Response.Buffer = True,让缓存提高 ASP 的效率。
当使用缓存时,服务器在处理完整个页面后,才把页面内容发往浏览器。利用缓存,可以提高 ASP 的性能。如果关闭缓存,ASP 需要等待客户端的 TCP 确认,这使性能下降,尤其是在网速很低的情况下。如果你的页面比较复杂,处理起来很耗时的话,用户可能以为浏览器没有了反映,这时,请使用 Response.Flush。
在代码2中加入 Response.Buffer = True,然后再测试一下。
Click! 测试代码 (注意:此代码从数据库中检索数据,如果是第一次连接,测试时间会长些。多测试几遍,取其稳定值。)
WAST 测试结果:TTLB:39.72。
在 IIS 5.0 中,使用缓存是缺省的设置。
7. 注释行对性能几乎无影响,给代码加上注释是编程的良好习惯。
接下来,我在代码中加入了200行的注释,看看注释对性能有什么影响。
Click! 测试代码 (注意:此代码从数据库中检索数据,如果是第一次连接,测试时间会长些。多测试几遍,取其稳定值。)
实验结果:TTLB:40.21。
8. 适度使用包含文件
使用包含文件对速度有影响,但包含文件也有诸多优点:共享代码,易于维护等等。在速度和可维护性,可扩展性之间进行权衡,而不要一味的强调某一方面,才能正确的使用包含文件。( 参见文章:包含文件的得与失 )。
9. 重复引用 COM Object 属性时,把它存储在变量中进行引用。
slower:
If rs.RecordCount = 0 Then
......
Else
For i = 1 To rs.RecordCount
......
Next
End If
faster:
Dim lngRowcount
lngRowcount = rs.RecordCount
If lngRowcount = 0 Then
......
Else
For i = 1 To lngRowcount
......
Next
End If
在 VBScript 5.0 中,可以使用 With 语句。
slower:
rs.ActiveConnection = cnn
rs.CursorType = adOpenKeySet
rs.LockType = adLockOptimistic
faster:
With rs
.ActiveConnection = cnn
.CursorType = adOpenKeySet
.LockType = adLockOptimistic
End With
10. 不要在 ASP 中声明脚本语言。
即不需要 <%@language=vbscript%>
在性能上有提高,但不明显。
11. 尽量不使用 Session。
ASP 的开发人员通常使用 ASP 内建的机制(Application 和 Session)来保存某种状态。Application 的数据可以被所有的应用共享,Session 可以保存单个用户的信息。然而,这是有代价的,尤其是 Session,你需要为每一个用户创建 Session,这是相当消耗资源的。其实有很多种方法可以替代 Session 并能完成同样的功能。( 参见文章:不使用 Session 保存数据 )。要做到不使用 Session 很容易,只需要加上 <%@EnableSessionState = False %>
另外,当你使用 frameset 时,更应该使 Session State 为 false。ASP 要求在同一会话中只能有一个请求可以执行,如果一个用户同时请求多个页面时,不会以多线程的方式处理这些请求。所以,在 frameset 中的页面是一个一个的进行处理,而不是同时进行。
12. 使用 <% Option Explicit %> 。
在ASP page 里加上<% Option Explicit %>可以提高速度。看下面的例子:
代码1
<%
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
......
%>
代码2
<%
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
......
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
......
%>
代码3
<%
Option Explicit
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
......
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
......
%>
代码3比代码1速度快,代码3和代码2速度几乎一样。
13. 如果你能保证没有错误,就不要再加上 On Error Resume Next.
测试 asptoday 提供的代码,On Error Resume Next 会降低 ASP 1.42% 的速度。
14. 在页面中尽量使用一种脚本语言。
15. 把长篇大论的代码放到组件里。(如果你有这样的条件)
组件的优势在于快速,可重用,可访问系统(比如Win32)等等。虽然,它编译麻烦,需要重注册,重启 Web Server(可以用 WSC 作为过渡)。但是在处理复杂逻辑运算时,它几乎可以说是唯一的选择。而且在 IIS5.0 中创建组件的过程已优化了,不象 IIS4 那样效率低。
16. 不要动态分配数组。
Redim 一个数组,就需要为新数组分配空间。最好预先分配好空间。不过这样做好不到哪去,尽量不要使用动态数组。
17. 在长时间的循环中使用 Response.IsClientConnected 节约 CPU 时间。
For i = 1 To 1000000
......
If Response.IsClientConnected Then
......
Else
Exit For
End If
......
Next
18. 只在需要的时候使用 Transaction
<%@Transaction = Required %>
<%
Dim FirstName
......
根据 asptoday 文章所述,上面的代码使性能降低 140.4%。
19. 尽量少用 Server.MapPath
当你使用 Server.MapPath 时,它会产生额外的请求,使速度降低。
20. 删除 global.asa 中空的 Session_OnStart 和 Session_OnEnd
21. 利用浏览器进行确认
22. 使 Browser 和 Proxy 缓存
'使 browser 缓存
1.<% Response.Expires = 10 %>
2.<% Response.ExpiresAbsolute = #May 31,2002 13:30:15# %>
3.< META HTTP-EQUIV="Expires" VALUE="May 31,2002 13:30:15" %>
'使 proxy 缓存
<% Response.CacheControl = "Public" %>
23. 用 Server.Transfer 代替 Response.Redirect
参见文章:ASP3 的新特性
24. 在 URL 中别忘了 "/"
'bad
'browser 需要向服务器请求两次。
<a href="http://www.microsoft.com" >microsoft</a>
'good
<a href="http://www.microsoft.com/" >microsoft</a>
分享到:
相关推荐
1. **ASP代码优化**: - **减少冗余代码**:删除无用的变量声明、空行和注释,精简代码。 - **避免全局变量**:过度依赖全局变量可能导致内存泄漏和数据冲突,尽量使用局部变量。 - **优化循环结构**:使用更高效...
在ASP编程中,代码优化是提升网站性能和用户体验的关键环节。以下是对ASP编程基础语法和优化策略的详细阐述: 一、基础语法 1. **响应对象Response**:ASP中的Response对象用于向客户端发送数据,例如输出HTML文本...
"ASP.NET中错误处理代码优化--vs2003"这个主题主要关注如何在ASP.NET环境中,特别是在Visual Studio 2003下,对错误处理代码进行优化,提高应用的健壮性。 1. 错误处理的重要性:错误处理是程序开发的关键环节,...
"专用 ASP 代码 调试 工具"显然是为了帮助开发者更有效地定位和修复ASP代码中的问题。 ASP代码调试工具有以下关键功能: 1. **错误检测**:工具能够识别并标记出ASP代码中的语法错误,如拼写错误、缺少的括号或...
- **代码优化**:生成的代码通常会遵循最佳实践,避免常见的性能问题。 - **易于集成**:生成的ASP代码易于与其他系统或模块集成,促进项目的整体开发。 6. 使用流程:首先,配置数据库连接参数,如数据库类型、...
解密后的代码可以帮助理解原有的业务逻辑,进行代码优化或迁移至新的平台。 总的来说,ASP代码解密工具是针对加密ASP代码的一种辅助工具,它能够帮助开发者揭示隐藏在加密层下的程序逻辑,以便于代码的调试、维护和...
这些建议旨在帮助开发者编写更高效、更可靠的ASP代码,提升整体系统的性能。优化不仅限于代码层面,还包括了对服务器配置、数据存储和网络通信的综合考虑。遵循这些最佳实践,可以有效地提升ASP应用的运行效率和用户...
"专用ASP代码调试工具"就是为了帮助开发者高效、准确地定位和解决ASP代码中的问题而设计的。 传统的ASP调试方法通常依赖于IIS(Internet Information Services),这是一个功能强大的Web服务器,能够运行ASP应用...
自动生成数据库操作代码的工具则能解决这个问题,它可以根据数据库结构自动生成相应的ASP代码,使得开发者可以快速地实现数据的增删改查功能。 这些工具通常会提供以下功能: 1. **数据库连接**:自动生成连接...
这款工具的安装过程非常简单,只需要将压缩包内的"ASP代码调试工具.exe"文件复制到你的源码文件夹内,然后双击运行,无需复杂的安装步骤,符合绿色软件的特性,即下载即用。 使用ASP代码调试工具,开发者可以: 1....
"ASP代码转PHP代码V1.0"是一款工具,其主要功能是帮助开发者将原有的ASP代码快速地转换为PHP代码,以适应项目从ASP平台向PHP平台迁移的需求。 【ASP与PHP的差异】 1. **语法差异**:ASP主要基于VBScript或JScript...
4. **文件存储**:验证通过后,ASP代码会将图片保存到服务器的指定目录。通常会生成一个随机或唯一的文件名,以避免文件重名问题。同时,也要考虑文件权限和安全设置,防止未授权访问。 5. **数据库记录**:为了...
使用"asp代码行数统计器"可以辅助开发者进行代码质量管理,通过比较不同阶段的代码行数变化,可以发现代码膨胀的问题,从而进行代码重构和优化。同时,它也可以帮助管理者监控项目的进展,确保项目按计划进行。总的...
【企业网站源代码优化】 企业网站源代码优化主要关注以下几个方面: 1. **性能优化**:通过减少HTTP请求,合并CSS和JavaScript文件,优化图片大小,使用CDN(内容分发网络)等方法来提高页面加载速度,提升用户...
使用ASP代码加密大师的正式版,开发者可以享受到更高的代码保护级别,这可能包括更复杂的混淆策略,更严格的运行时检测,以及更好的兼容性和性能优化。同时,正式版可能还提供技术支持和更新服务,确保随着技术的...
总之,Asp.NET动软代码自动生成器是一个强大且实用的工具,它结合了Asp.NET框架的特性,提供了一种高效的方式来自动化编码任务,使得开发者能够更专注于创新和优化,而不是基础的代码编写。无论你是初学者还是经验...
ASP.NET是一种由微软开发的服务器端Web应用程序框架,用于构建动态网站...通过研究这些项目,你可以学习到如何组织代码结构、如何处理用户交互、如何优化性能,以及如何利用ASP.NET的强大功能来创建复杂的Web解决方案。
ASP博客制作源代码是针对初学者和Web开发者提供的一个实用资源,主要涵盖了使用ASP(Active Server Pages)技术创建博客系统的基础知识。ASP是一种基于服务器端的脚本环境,它允许开发人员通过HTML、VBScript或...
【ASP聊天室完整原代码】是一个面向初学者和专业开发者提供的资源,用于了解和学习如何构建基于ASP(Active Server Pages)技术的在线聊天室。ASP是微软开发的一种服务器端脚本语言,允许开发者创建动态、交互式的...