- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
<FONT color=#fed969 size=4>
* M& y4 _3 S9 N, | o; Z% S% x1 @: Q< ><FONT color=#f70909>作者;小珂 转自<a href="http://www.hackbase.com/" target="_blank" >黑基</A>bbs<a href="http://hackbase.com/News/hk" target="_blank" >原创</A>作品版; V. p5 n* [0 x0 k. q4 b V" A1 t3 W6 P
版权归<a href="http://hackbase.com/hacker" target="_blank" >黑客</A>基地所有, 转载请注明出处</FONT></P>3 f% L5 x% m! B: m+ V1 m
< >前一日子写了篇替VB喊冤,感到说理没有力度,泛泛空谈,远没有起到喊冤的效果-_-
- Z3 w5 O# ], A* E所以呢,现在把我以前的VB<a href="http://hackbase.com/hacker" target="_blank" >代码</A>优化的一点小小的<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,希望可以给大家带来点帮助,也希望大家能, o) K% a# ^9 _4 y& h& u( ?
把各自的观点补充一下~~
7 \" k; v" y6 y& y. t* K第一,偶认为要写出运行速度快的程序,在定义数据类型上要注意一下,
; I3 I$ H/ i4 E$ ~比如说Single,Double和Currency这几种数据类型如果可以的话应尽量用Integer或Long 代替,说到这,有位仁兄举手发言了:“那偶要是想数据能够保存小数,怎么能用那2个整型呢?”,别急啊,我下面就想说这个,其实小数也可以保存在Integer类型的变量中。" I; ^+ Q# F7 }% j, `7 t+ F
例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。% u+ F8 `& s# s$ F* q2 r4 q9 q) t
根据<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>,使用Integer和Long替代Single,Double和Currency后,<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的运行速度可以提高将近10倍。
5 p6 V) }6 b. A4 A6 I7 X这个可不是吹牛啊~~,不信你也试试?</P>
* J& x0 Y" y- A$ v< >第二,要尽量避免使用变体,这个稍微懂点<a href="http://hackbase.com/hacker/program" target="_blank" >编程</A>的估计都能理解,5 g! I1 \3 T7 ?( p: C; ?
变体类型的变量需要16个字节的空间来保存数据
- s E! i3 j! O" A/ J# L) Y- ^" k. u如果想写出效率高,质量好的程序,就不要偷懒哦~~</P>
" s( B1 x8 ?7 u B9 P" q< >第三, 尽量使用数组,避免使用集合,
7 a) E1 h/ f+ A) P7 q能用数组的就不要考虑集合,为什么?
: N9 @ z# Q3 p" a在VB中,数组是最高效的数据结构之一。9 e2 P- r$ e/ V' z6 t, _6 t% s- `
自己想想,集合作为一个对象,
$ ]! C6 ?: k' \ t% a' U& J: z& H其数据的存取速度可能只是数组的百分之一哦
; U, n, a/ n) E: ?,所以说能用数组的千万不要自己去找麻烦~~( x0 L7 @/ S8 s2 F
当你有多个保存类似数据的变量时,也可以考虑将他们用一个数组代替。
" ?! @$ D# y& o% o7 l, i6 l另外记着不要使用循环来在数组间进行拷贝工作,
7 l# I9 e' H7 o5 D4 d7 S2 W% q请使用更快的API函数:MemCopy或者RtlMoveMemory</P>" a5 X" u8 c1 {1 w7 v7 F
< >第四,尽量 不要使用ActiveX控件) p+ R/ ?4 g. M/ ^4 W+ S
除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,
. ], d7 B4 D# u例如类。这两者之间的效率有很大差异。
. T: g/ W2 b+ B+ Y9 P如果你设计的ActiveX对象不涉及到用户界面,就使用ActiveX DLL代替控件6 |/ l2 e/ M1 d& B( }: L; ^. Z
在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,. z9 [ t3 w/ v8 Q
然后再加入工程中。我建议你最好不要这样做,
% m7 u" w7 }/ h! }+ R因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。- j0 B6 Y6 l) z/ C
每当你调用方法或存取属性的时候,都会浪费大量的系统资源。
1 R, d2 {8 x6 a" R$ m8 d5 t, G: F如果你有ActiveX控件或DLL的源<a href="http://hackbase.com/hacker" target="_blank" >代码</A>,将它们作为工程的私有对象。</P>: S: f' ~! U& A) b
< >第五,减少模块的数量
x" j7 T# A, J1 \有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。
% p' H4 v+ @. ]8 W2 B4 B, b, q* S! j但是在一个模块中只写上二三十行<a href="http://hackbase.com/hacker" target="_blank" >代码</A>就有些可笑了。4 m. z8 l6 R" x) o
如果你不是非常需要模块,尽量不要使用它。这. k" b) j. ?0 s* k. u& X6 t
样做的原因是因为只有在模块中的函数或变量被调用时,1 S3 q, ?$ x- j6 \, S0 e z
VB才将模块加载到内存中;当VB应用程序退出时,
5 I# D; |) } ]8 S0 `4 Q. J- x7 I才会从内存中卸载这些模块。如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中只有一个模块,
; p2 Y r2 o$ U2 YVB就只会进行一次加载操作,这样<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率就得到了提高;
. y+ G6 O& @" _- F0 b反之如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中有多个模块,VB会进行多次加载操作,<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率会降低。</P>! F4 M5 L6 Z& w: L2 ~' E
< >第六,减少图片的使用
0 C; {" V* C( i6 a& _图片将占用大量内存,而且处理图片也需要占用很多CPU资源。
, E2 Z' `" _& d! b1 o7 i% M在<a href="http://down.hackbase.com/" target="_blank" >软件</A>中,如果可能的话,
% y5 j2 o x% ^9 s- Z可以考虑用背景色来替代图片,这个我常用,呵呵~~</P>& a w0 }) [3 F8 x) [* Y( r
< >第七,其他的一些小<a href="http://hackbase.com/network/network" target="_blank" >技巧</A>
( \" j) k* u4 w1,判断字符串是否为空2 M, |/ u0 @8 d" X3 O$ F; J
检查字符串是否为空时一般使用这种方法: f! i( B+ P4 W
If Text1.Text = "" then
0 `& E9 P( D8 T( n! s3 jend if
) A1 ^4 ~: E. ?) p. m1 B0 p K' j如果使用
) [- Y1 w! F) P/ CIf Len(Text1.Text) = 0 then P' k; B1 u: h) ~4 V
end if
3 B. G* k; s. K8 z3 ^效率会大大提高
0 O+ ]' X. A+ R. A- [# N) m p0 X2,多使用With语句引用对象0 Z- ?3 ]4 Y6 t! Z& Q7 z7 P
3,单独定义和分配对象7 B( q# ~, X3 _5 }
定义对象和分配数值可以使用联合语句:Dim obj As New MyClass。但是这要比以下2个单独的语句运行速度慢:
, h5 a% w$ e; o8 R9 IDim obj As MyClass ! S. s9 r( D/ y3 r2 C5 O; h9 x6 `( T
Set obj = New MyClass" k" Y, `! C1 y/ I: ^1 I3 L
4,使用Move方法
/ u; \$ T# U; E0 S$ p5 G" n" K8 ?在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性,如果使用Move方法代替,效率会提高很多
; y* {4 B- F- Z* F比如
! {3 t+ q' Y! K! U% iImage1.Width = 100
/ Y! V# U3 w4 r' }0 C4 _( ?Image1.Height = 1009 x2 z2 S( g0 h5 I! A4 Z
Image1.Top = 0
/ L$ @5 K* w$ C% g, DImage1.Left = 0
2 n% s( x5 F3 T a: t就可以使用Image1.Move 0,0,100,100 代替</P>! I4 R" }/ Z6 G# V
< >第八,算法优化
1 l3 s! r! @: g% v尽可能不要使用平方根运算
) u# k; a) |( f) O* ^0 V+ j实践证明,使用平方根运算将耗费很多的运行时间。. a, @' B2 U) [3 ^
比如:宁可使用语句If a * a + b * b = 4 Then ...,) h" u$ C/ ?: d& G' l
而不要使用达到同等目的的命令If Sqr(a * a + b * b) = 2 Then ...。</P>
0 z8 R4 ?( t( A) m" m< >写了一夜了,也就是把自己以前的一点<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,当然还有许多方法一时也想不起来了! l; Q: k% v1 U
我会在想到过找到这方面的信息时再继续哦,希望大家也能把自己的相关<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>补充一下
) y% T0 _0 R* Y, M) x! ?另外我写的如果有原则性错误也欢迎大家批评指正,这里先谢谢了~~1 K; E0 a2 M: c1 m: J1 Q
我去睡觉了。。。-_-</P></FONT> |
zan
|