[技术]全面优化ASP应用程序的性能
ASP 本身并不是一种脚本语言,它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境,而在ASP中最常用的脚本语言就是VBScript了。虽然ASP的脚本语言很简单,但是要想让一个ASP程序能够最优化的运行也不是一件简单的事情。 : o5 A" G8 D7 W) w/ p
, N" [- p' D& ]' ]2 a6 D
现在国内的网络带宽很有限,网络十分拥挤,如何使得自己的ASP应用程序能够快速的运行就成为了每一个ASP程序员的梦想了。那就跟随我来一同加速你的ASP程序吧!
5 {3 i" l- N5 A8 H) U# |8 C6 Y7 l+ z; Q( l2 b, H
5 d0 ^; n" _# T
5 B) m; e+ `, t3 V1 R' i: i4 A0 _7 L一. 有关操作数据库的优化方法
9 j! g( W/ P# X1 H4 }6 V- X& _
7 s h7 W4 H2 z* C; X4 Q 我们使用ASP最主要的用途就是对数据库进行操作了,如何更快速的完成这些动作呢?
$ I( W9 k8 @1 H k
/ D5 ^5 S5 H9 T) ]( s( F( f1. 不要任意使用“SELECT * ......”
4 k' B5 a Y& m, }# \" J. P; j6 i5 l6 ^- A" L1 X" O6 E
请尽量拾取你所需要的那些字段,比如,一个Table中有10个字段,但是你只会用到其中的一个字段(name),就要使用“select name from yourtable”,而不是用“select * from yourtable”。你或许会说,我是这么做的阿,但是,如果一个table中有50个字段,你需要用到其中的23个字段的时候,你会怎么做呢?为了节省打字以及查找对应字段名称的麻烦,你就不一定会老老实实的用“select name,sex,age... from yourtable”了吧!
E6 s+ w1 z% s3 _
7 v% E8 N) f, ~" W5 y 实际证明,尽量拾取你所需要的那些字段来使用select语句将会是你的ASP程序至少加快5%左右。
5 h, {& j/ E# X) y9 m0 Y9 G$ @& M$ O! q* F
2. 尽可能使用系统存储过程(针对MS SQL Server) ) D0 y6 x$ c9 j( P
* f& d. Z/ @, Z% J2 _
有的时候完成一个读取操作,使用SQL语句和存储过程同样可以完成,但是使用存储过程将会大大加快完成读取操作的速度,也就提高了你的ASP程序运行的速度。 2 |' p5 c" s! q6 `8 E: U2 {
8 K1 T; B8 v% B0 V
3. 注意你的游标使用方法
z7 ^/ A6 | y) i* _) ?* \# D8 g" B
如果你仅仅是对一个table进行读取操作,那么请你使用forward-only,read-only游标,因为这种游标读取数据库是最为快速的,尤其是你的读取数据量很大的情况下。
+ w c3 Z! z4 M0 ^
; @, ^. n2 v! U( m' h* O2 \+ S# X4. 不要打开无用的独立记录集
! x4 j, ?- P! r- u
9 E: V3 d6 f0 Z4 B* g/ L3 V 也许你在笑了,我会打开没有用的记录集吗?是的,你当然会,比如在生成一个树型记录集的时候,你不得不打开父记录集以及对应的子记录集,甚至还有孙记录集,其实你可以使用ADO提供的Data Shaping技术来替代打开多个独立的记录集,那样会加快程序的运行速度。(关于Data Shaping的用法可以参考ADO帮助) $ v$ D5 S! e2 k6 a, W+ T
. h" C C3 S9 w, s; V
5. 一定要记着关闭打开的记录集对象以及连接(Connection)对象
. B# `. H- x3 Q; H: W6 _: S; {& x o' r' w' e7 p! q
有些朋友总是奇怪为何自己的ASP程序刚开始的时候运行速度很快,可是多运行几遍就越来越慢了呢?甚至出现服务器死机的情况。发生这种情况,就很可能是你打开了太多的记录集对象以及连接(Connection)对象而最后却没有关闭他们引起的。使用如下方法进行关闭: + J" x: p# P0 F& \% d, _1 |: A
8 X2 z4 m5 c7 n; HYourRecordSet.close
. Z5 c, }$ z9 w3 q/ ^- e6 @0 c- w* X' V8 H5 ^
Set YourRecordSet=Nothing # Y" F$ R; R1 Q/ Q U
) P T# {2 K) }$ ^6 _( C' A: p
Set YourConnection=Nothing / i8 q$ _+ R/ p" p6 c
& A* h6 m9 ^, r' a/ m( T
6. 取得数据库数据的方法比较
' J$ m& S2 w( m3 I: y+ w! S4 ^; v: i/ I( U; ^$ g
你是如何得到记录集的数据的呢?是不是用YourRecordSet(字段编号),还是YourRecordSet("字段名称")?其实还有其他的使用方法,现在我们就比较一下吧(100条记录): . x/ {) f B& P8 m' w3 D: `
% W) ^# X) c3 U8 U4 t$ m/ v& U" O, W) H; z
?# N, V/ ?9 H
Rs("字段名称")
1 n# Q' T$ ~7 @4 v/ B2 s; w1 A* J4 `
Rs("字段名").Value 5 W& m) r7 i' q7 b* g
! _6 |. v! l5 r1 E7 l$ r* [
Rs("字段编号")
7 B/ Y# B# g3 _2 w
$ J9 o. U) }9 ]9 V4 A6 O$ b) MSet方法 5 f2 N4 ?& Z7 |( O* z
( Z" c& K2 M; x5 q" D E
数据库回应时间
$ g" G) ^ b" O6 W3 s9 h! A! n
/ i& D" R- K' z# Q' w6 K' S/ L2.967秒 + _4 e! M. U8 V" S5 U3 y: g0 T
8 e1 P$ \1 j; a) t& Y
2.936秒
" W9 E3 @8 M* g8 J
$ U: _: q- V) l c! l4 d1.650秒
7 o+ B% ~0 J5 L9 N( U2 g* X! s! K$ m% w% F3 l: i# J ^
0.586秒 ) x0 ]2 {7 J1 H4 d. J( F
, {3 C; ^5 ^! G. J" r- _% q& n
* E' x* }; }( a* Z# @4 Y4 T& T+ j* H) ~' L9 W6 C
2.824秒 " p2 K1 |- D: R; x
]. m$ [7 d# e( }2.914秒 7 Y$ H* ?" I5 K+ w1 e# j
4 U+ i" F) S8 \2 |1.611秒 ! U, ~: b+ O) l) z K' Z3 w) f3 l# L2 T
( t6 {! ~2 J$ T9 l; u' A+ _- K0.602秒 - b1 L7 W8 u/ Q3 [4 s3 _
2 f" U% S3 }1 ?, W t6 Q- ^- c
% t8 \/ }, I9 ~8 W0 o8 O# |, O* i* t
2.893秒 3 D7 W! s2 b0 L0 }* b0 ?0 k3 ~: e
- Q4 z0 R2 ~- j. R2.943秒 ! ?. A) X+ d! ~0 L2 B
; m# Y# w7 x- w% C6 U0 M; c
1.613秒
/ g y$ ^7 M6 a: O5 c' l: N; S b: c' r8 Q5 X
0.594秒 6 g7 c5 N8 u6 P1 r) U2 i
6 \2 a3 _) T5 B# m) n* v: f平均回应时间
# M# X. a* h8 y/ }' _7 ?6 a+ D, F1 y; _* | n+ U6 u
2.895秒 p( d1 w( {+ B$ C% t- T7 k2 x
# J0 p4 I9 E& Y% H, ?2.931秒 % k% B V- X: b1 B- [% z% P
7 c. T& `3 K0 O1.625秒 / z. w# _6 s+ ]- d3 X* ?4 i. h
- v( X7 b2 j* A& u
0.594秒 7 Q9 G) g& }* A. p( b7 p- }
. r2 ~3 z$ N1 x( |" [
) E3 B9 C* p8 R# y7 r6 {; g
% A1 B' i: t$ R 这下知道了吧,前三种方法大家都可以看的明白,我就说说第四种方法(Set方法)如何使用: 8 K2 |" q# u. H6 K& m
8 h- k0 Z: f- N4 _, f7 {# V7 N
Dim strSQL / j. Y! ~: D% i& {9 x8 h; V0 b' A
$ R2 g8 H+ W3 [+ g5 n8 t2 B
StrSQL="select name,sex,age from yourtable"
) }, l+ |0 E& Q3 X
- s: p' |* s1 l, z* s8 r3 M! VDim rs 8 G% ~, i/ W. p! x. g
# H) W8 w3 @4 ?Set rs=server.createobject("ADODB.RECORDSET") 2 Z$ p1 m! r" Y A0 X
9 V/ U! w9 b+ {Rs.open strSQL,conn,1,1
& u+ u0 V1 a; S% Q- B6 g+ ^
0 B$ B6 q8 A; A0 z# n+ EConst fieldsOrder=2 $ [8 |+ c! g6 } k" I2 p" W, y
, x7 {) t Z6 CDim objOrder ; p6 F6 f' n/ C& f6 b3 w) e- F
* m( Q- o0 |% @2 B1 d0 zSet objOrder=rs(fieldsOrder)
! O( Q, a8 l( E9 \4 F
$ j+ I; q7 X( M4 s2 ~. U; |Response.write objOrder 'Set方法 ( M x2 F: | K, U
6 y0 m# b/ W. n+ G6 _
6 }% a) Z: h- K4 s- g9 K- R" C3 |
二. 有关ASP内置对象使用方面的优化方法
. n; K$ @( G: D( g) w) R7 w$ I4 ?. y4 H8 g( P# x4 |( U* u
1. 尽量减少Session对象和Application对象的使用 : \ ?5 e! ^; r
) ? O/ e) L1 r+ X q9 C 虽然ASP中提供的这两个对象对我们的编程提供了很大的帮助,但是,对这两个对象要合理的使用,不要滥用。因为大量的使用这两个对象将会极大的增大服务器的负担,严重消耗系统资源。也将使你的ASP程序运行慢如老牛。 : F0 |1 ^& M m: o$ S. \) N
/ o* V1 y3 _ O8 V. z' ?4 a3 x2 E
2. 要及时的关闭不再使用的对象(尤其是Session和Application) V/ s4 l- ~6 c
- |! I$ [' w1 r: k+ Y0 W 不及时的关闭你所使用的对象会导致系统运行速度变得缓慢。也许你会问,Session和Application不是可以自动消失的吗?完全正确,系统默认30分钟内用户如果没有任何操作就自动触发Session_OnEnd和Application_OnEnd事件,但是大量的用户频繁的读取服务器,服务器将在很长的一段时间保持那些已经没有用的Session,Application对象,如果不及时关闭使用完的Session和Application后果将不堪想象了。
$ o# F& [' B8 U; [$ o
1 y! K [: u* X z6 F关闭的方法是:
2 {0 |1 y! x7 y- }" X
; M5 I3 b! |2 c# |" `/ p0 P+ a, ~9 Y Set 对象=Nothing
7 V: a' `5 N* B" r9 W3 w8 O+ C* L' a, a% T7 s/ A$ R3 y( o
三. 合理使用Include文件
6 E- D" J8 v. \+ ~. G3 M& i1 T& `5 E- s4 t( d
我们这里说的是指用<!--#include file="xxx"-->形式包含进来的文件,并且文件内容全是ASP程序,也就是说你将一些公共的函数放到一个文件中,并在其他有可能调用其中函数的页面包含进来。
% X+ w3 U: b. v# |; o0 s' u
4 D- f1 }0 d" o5 B# {9 n: }建议你不要将所有的函数放到一个包含文件中,因为你在其他页面包含这个文件的时候,服务器端是要进行预编译的,很可能在一个包含文件里面有上百个函数,而你只是想要使用其中的一个函数,这样就得不偿失了。所以,尽可能的分割你的包含文件成为多个小的包含文件。这样也可以提高程序的运行速度哦。
" `% r" B% h4 B& i7 [. W) x3 r @' V6 g# N
四. 有关VBScript语言方面的优化方法 % C' H/ O0 U! E
T3 C( S0 `7 _3 E9 ]1.尽量使用系统函数代替自己编写的函数
9 J7 G7 e9 O2 E# h0 P2 n
; F0 k/ `5 a8 @5 C H; w4 \; o$ w 比如要想分割一个有规律的字符串("sss,ddd,fff,ggg"),就不必自己使用什么Mid(),Instr等等函数来分析了,其实VBScript就提供了一个函数 Split(),这样既省时间,又提高了速度,何乐而不为呢?
' i* F4 e4 }* {
5 I7 H9 s# K/ Z( J& O: N2 f2.减少动态数组的使用 : T1 K1 r R' a' O, F1 S) ?
" K7 r# x' k- X6 x+ U8 D4 r3.尽可能的养成提前声明变量的习惯
$ U' t2 X% D1 }) H0 m- Z8 f7 w' C& g; n
不要小看了这一条,提前声明变量会加快程序的解释执行时间。相反,从不声明变量,不但程序难以阅读,整个程序在服务器的执行效率也会大打折扣的。
% ]! @ u2 b* V& S$ W5 A
# V" Q7 o$ X, U- R! q0 a v" j五. 其他方面的优化方法 ) J) @8 b3 Y4 c1 Y+ }
* f( n: O# C7 d! N
1. 在ASP文件中尽量使用<%%>嵌入到HTML标签中,而不要使用Response.write的方式,比如:
: M) V8 y, G! N
$ M4 I" W g& {" I v<html> - Q( a- w$ n, U/ z
. D9 K: Y: @% e8 C3 R9 m" M
<body> - V6 S o/ u9 B, n% ~- |: `
$ q4 ^! n1 C: N' j<%If ok =1 then %> * f5 z$ t$ ?7 F7 v
2 ? g& Q$ D4 i; R3 v1 w* _
Hello! World! 1 ~+ u- C1 R( C5 Y
- r& {7 n* t7 x; g" k<%End If%>
+ z* C( ]' a: |* s: D% |' S3 C# k }0 Y- O" {
</body> * y. }2 Q, y9 _' R1 W2 ^
7 c2 }: A6 _& X! q# z1 b8 h
</html>
) @) C/ i h: W- T: z2 N
i0 B8 a0 r' f6 p就远远比:
; U0 ?. x7 t2 e @ K! ^( w
4 L! K/ T* r$ O7 q1 K+ p<% 1 t- f- W, B5 e6 [0 r
0 c: U6 K- O( a1 F! ^
Response.write "<html>"
) l t/ {( n) `1 E5 k; t& E$ E Q: d* C( T
Response.write " <body>" 7 ~# H% l a1 \* ?' ^, S' m y( @
1 O2 o2 w/ u {7 z! Q If ok =1 then + X; x' I/ R% F; M
* o1 c9 i/ `2 P |3 M9 I6 ~3 @# o7 @& M Response.write "Hello! World!" # e6 P- g/ r7 [/ x
- V. e, }4 o4 ~; D4 j; s; ]; @
End If ( z1 |6 s/ z9 }
5 Q# [) ?/ `) z) \2 v- FResponse.write " </body>" & T$ X+ g/ b% E& @! z
6 a* b' H8 s! p! i4 YResponse.write "</html>"
# H s/ W J* L% R! V" Z" q& L, o0 X+ i+ G: N7 }
%>
U! M* M# f: d, M
! E D/ Y+ s# W2 S! m! C的运行速度要快,尤其是你的ASP文件比较大的情况下。因为,第二种方式增加了服务器端的解释时间,因而也就降低了ASP程序的性能。
) B/ ^% M3 I; C# ^( J0 d2 M# {1 a( S
2. 尽量用一个ASP文件完成一个动作
6 D) u2 {7 Q8 Y4 o3 X1 V( a' H" e0 W- e- F
很多人喜欢在一个ASP程序中同时完成诸如添加,删除,查找等等多个动作,不要认为这样是有效的利用了文件,相反,这样做的结果是使得应用程序的运行速度减慢很多。 4 j9 W/ _0 z( |! I
& s$ s0 O% m! X- x4 v& Z应当将添加,删除,查找等分割成单个的独立的ASP文件来完成。这样使得文件不会过于庞大,降低服务器端解释执行的负担,并且阅读程序也很快捷。