- 在线时间
- 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>
& J7 S2 a Z" j( u2 ^< ><FONT color=#f70909>作者;小珂 转自<a href="http://www.hackbase.com/" target="_blank" >黑基</A>bbs<a href="http://hackbase.com/News/hk" target="_blank" >原创</A>作品版$ B: u( }+ E7 n. U% e0 z7 x
版权归<a href="http://hackbase.com/hacker" target="_blank" >黑客</A>基地所有, 转载请注明出处</FONT></P>- f$ S# K9 q4 L% ?' |
< >前一日子写了篇替VB喊冤,感到说理没有力度,泛泛空谈,远没有起到喊冤的效果-_-' x: `/ E: w: ]
所以呢,现在把我以前的VB<a href="http://hackbase.com/hacker" target="_blank" >代码</A>优化的一点小小的<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,希望可以给大家带来点帮助,也希望大家能8 T! Z, u2 B, l" |. o4 s
把各自的观点补充一下~~4 X/ T$ {0 Q7 o1 c K
第一,偶认为要写出运行速度快的程序,在定义数据类型上要注意一下,4 n+ M: ^* W" r, j7 B
比如说Single,Double和Currency这几种数据类型如果可以的话应尽量用Integer或Long 代替,说到这,有位仁兄举手发言了:“那偶要是想数据能够保存小数,怎么能用那2个整型呢?”,别急啊,我下面就想说这个,其实小数也可以保存在Integer类型的变量中。( p& c5 |" C. E- t3 ~- ^' a3 ]& j
例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。 i6 |' Z a4 T$ I+ N. U
根据<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倍。
8 V9 M6 r$ I8 T这个可不是吹牛啊~~,不信你也试试?</P>
! P/ L7 c" N2 ]2 s8 r< >第二,要尽量避免使用变体,这个稍微懂点<a href="http://hackbase.com/hacker/program" target="_blank" >编程</A>的估计都能理解, j. |0 \3 D$ [$ }3 q
变体类型的变量需要16个字节的空间来保存数据
, z# D. c2 H5 L$ U# M/ t$ ]! f如果想写出效率高,质量好的程序,就不要偷懒哦~~</P>
( A3 n" m& g: A+ Y5 p. c< >第三, 尽量使用数组,避免使用集合,
& Q, n- f% k# P" i7 G能用数组的就不要考虑集合,为什么?
/ p1 l; [! C; v' t在VB中,数组是最高效的数据结构之一。
! J2 A, t% j* B8 t+ c* M5 t- S自己想想,集合作为一个对象,9 J( E* F7 {5 h7 Q6 E l3 f' P
其数据的存取速度可能只是数组的百分之一哦
# K$ b! o* M8 E. n,所以说能用数组的千万不要自己去找麻烦~~ W$ c$ J/ k6 J9 a$ k
当你有多个保存类似数据的变量时,也可以考虑将他们用一个数组代替。# R8 Q- j, H5 M, W, r% |. L+ g
另外记着不要使用循环来在数组间进行拷贝工作,
* ?: W7 t; n# x3 x请使用更快的API函数:MemCopy或者RtlMoveMemory</P>" ?9 j# i7 W2 ^0 ?; n9 d8 \
< >第四,尽量 不要使用ActiveX控件" _: f4 R/ G5 p# k. i8 F
除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,
9 _& T9 ^! n5 {5 F: T例如类。这两者之间的效率有很大差异。1 S# d" q3 I+ _4 `# H
如果你设计的ActiveX对象不涉及到用户界面,就使用ActiveX DLL代替控件" g, \9 k" {% b) D( i+ ]$ v: M
在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,
4 V! R/ R) Q1 V) p2 m# b然后再加入工程中。我建议你最好不要这样做,3 _! U G& b5 t, u* t& ^
因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。$ U6 V0 e }/ L! K9 E2 m& c) Y
每当你调用方法或存取属性的时候,都会浪费大量的系统资源。
) P* }2 o0 i# V6 b- y如果你有ActiveX控件或DLL的源<a href="http://hackbase.com/hacker" target="_blank" >代码</A>,将它们作为工程的私有对象。</P>2 Q& _8 r" n) ]4 k( l) w
< >第五,减少模块的数量
3 y) q* R; [, V, T( P有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。
2 {: Q0 @1 L7 m; J! r但是在一个模块中只写上二三十行<a href="http://hackbase.com/hacker" target="_blank" >代码</A>就有些可笑了。
8 d; B& `$ ~- V/ t0 L如果你不是非常需要模块,尽量不要使用它。这
' ^6 Z' _ X) `- I1 N$ ]样做的原因是因为只有在模块中的函数或变量被调用时,3 L# [6 u+ S/ e0 d$ m2 A
VB才将模块加载到内存中;当VB应用程序退出时,
0 h& O; U3 ~* e9 Y8 ?才会从内存中卸载这些模块。如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中只有一个模块,
% {' a y' s8 h T( d. s; FVB就只会进行一次加载操作,这样<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率就得到了提高;+ N* F j P3 O* V6 x$ q
反之如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中有多个模块,VB会进行多次加载操作,<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率会降低。</P>8 C+ h0 K5 t5 y; n0 g* h- w% D
< >第六,减少图片的使用9 |) | ]* z$ e+ K" l$ a
图片将占用大量内存,而且处理图片也需要占用很多CPU资源。3 J: \4 k N4 p' x. |
在<a href="http://down.hackbase.com/" target="_blank" >软件</A>中,如果可能的话,
2 z+ o/ D$ c% E0 [& p$ ]( o可以考虑用背景色来替代图片,这个我常用,呵呵~~</P>* \5 a! n, q% v* h& I
< >第七,其他的一些小<a href="http://hackbase.com/network/network" target="_blank" >技巧</A>
/ K$ V# a* R2 T. q' L1,判断字符串是否为空9 m9 q2 d6 q' E( R5 E
检查字符串是否为空时一般使用这种方法
1 H0 j0 f9 H0 A, z7 L3 LIf Text1.Text = "" then5 I6 O* D9 C% K8 B0 |3 X" h
end if
; ]/ O# X" g l6 @% e" J+ U, Z3 O* a2 R+ L如果使用/ ^+ k. A% K1 L, E7 S* y, M8 Q# N! |% U9 H
If Len(Text1.Text) = 0 then/ Y: I) @+ V! {
end if - k) {4 P5 B% j2 r9 z% P4 C
效率会大大提高* T' {$ w) W2 W" [6 t5 e& P
2,多使用With语句引用对象. v( @; v" S1 G% I* q9 j5 T9 v
3,单独定义和分配对象0 e% H7 K+ d# [* R# I
定义对象和分配数值可以使用联合语句:Dim obj As New MyClass。但是这要比以下2个单独的语句运行速度慢:
" z* X5 H' c6 Z0 ODim obj As MyClass
4 B/ A8 H' y9 z ZSet obj = New MyClass
* A2 X5 F6 ]/ v5 @4,使用Move方法
! D Y& J$ j2 s在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性,如果使用Move方法代替,效率会提高很多
0 E* N" X+ \& P$ w# p比如: }0 c6 E3 h, H8 O7 y
Image1.Width = 100
- O5 A- D& t2 d) R# ?Image1.Height = 100
( J+ c- Y q2 Q0 k* @6 B( NImage1.Top = 0
2 ~3 s* E7 K8 Z X3 NImage1.Left = 02 \6 B. X4 ?8 V' z
就可以使用Image1.Move 0,0,100,100 代替</P>7 C" y/ Z# f. R2 ~6 b! X
< >第八,算法优化
" {! Q2 R. p7 A+ ?2 B, L6 T k4 |- L尽可能不要使用平方根运算
6 s- S6 A/ Q5 @1 w' ~实践证明,使用平方根运算将耗费很多的运行时间。
& v; o. Q5 ^2 d& V比如:宁可使用语句If a * a + b * b = 4 Then ..., _ m" U/ K) r' P8 P2 y
而不要使用达到同等目的的命令If Sqr(a * a + b * b) = 2 Then ...。</P>) Z! Y0 Q& K# @6 `8 r0 q7 K) t1 ?4 C# H$ o
< >写了一夜了,也就是把自己以前的一点<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,当然还有许多方法一时也想不起来了
& ]+ J- @9 Q7 X/ M& `我会在想到过找到这方面的信息时再继续哦,希望大家也能把自己的相关<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>补充一下6 l7 Y" l" T5 P2 ~
另外我写的如果有原则性错误也欢迎大家批评指正,这里先谢谢了~~
3 w) k' a* }4 }; d' ^我去睡觉了。。。-_-</P></FONT> |
zan
|