数学建模社区-数学中国

标题: 漫谈VB代码的优化 [打印本页]

作者: 韩冰    时间: 2004-10-4 12:07
标题: 漫谈VB代码的优化
<FONT color=#fed969 size=4>
5 L4 E; ]. V3 S" D/ c0 F2 g<><FONT color=#f70909>作者;小珂     转自<a href="http://www.hackbase.com/" target="_blank" >黑基</A>bbs<a href="http://hackbase.com/News/hk" target="_blank" >原创</A>作品版
# x7 Y  W9 v- i% T  n0 q# W+ G版权归<a href="http://hackbase.com/hacker" target="_blank" >黑客</A>基地所有, 转载请注明出处</FONT></P>
* t  h( y- b+ D7 P<>前一日子写了篇替VB喊冤,感到说理没有力度,泛泛空谈,远没有起到喊冤的效果-_-
& G. }' P' r8 T6 O& x6 I8 M  l所以呢,现在把我以前的VB<a href="http://hackbase.com/hacker" target="_blank" >代码</A>优化的一点小小的<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,希望可以给大家带来点帮助,也希望大家能
* S6 ?" l' z  [' [8 J把各自的观点补充一下~~
9 I" `0 j; v1 X8 C7 b第一,偶认为要写出运行速度快的程序,在定义数据类型上要注意一下,
: H" y1 K$ }8 r; Y比如说Single,Double和Currency这几种数据类型如果可以的话应尽量用Integer或Long 代替,说到这,有位仁兄举手发言了:“那偶要是想数据能够保存小数,怎么能用那2个整型呢?”,别急啊,我下面就想说这个,其实小数也可以保存在Integer类型的变量中。
* g% {2 N) b$ g例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。
" U* B8 K" ]- x7 O3 k- A4 d7 I根据<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倍。
0 [: H2 F  J4 T7 `1 B* D* h这个可不是吹牛啊~~,不信你也试试?</P>
9 V! \& W2 l( U3 s7 R8 y1 i# S2 N<>第二,要尽量避免使用变体,这个稍微懂点<a href="http://hackbase.com/hacker/program" target="_blank" >编程</A>的估计都能理解,# H; x2 s" g, z0 Q0 {
变体类型的变量需要16个字节的空间来保存数据
7 N1 g% g) S3 Z/ ~# D2 P如果想写出效率高,质量好的程序,就不要偷懒哦~~</P>' s0 M; \5 u4 p. @
<>第三,  尽量使用数组,避免使用集合,
1 d4 S5 p  E3 y1 }能用数组的就不要考虑集合,为什么?9 A- J! i+ x2 C1 q* _. y6 S' W3 u& s
在VB中,数组是最高效的数据结构之一。, |  x+ {1 M0 n+ Y& p6 a
自己想想,集合作为一个对象,
7 a$ b2 R/ h! }% P0 V0 l/ Q其数据的存取速度可能只是数组的百分之一哦
: O* B/ X$ J" U' r6 k# k,所以说能用数组的千万不要自己去找麻烦~~
  ~" ]0 r% [- `! A. c" L* I# A1 r当你有多个保存类似数据的变量时,也可以考虑将他们用一个数组代替。
4 e+ U( d: J6 f7 g7 k9 E另外记着不要使用循环来在数组间进行拷贝工作,$ ^* X6 J5 p+ F! ?9 x
请使用更快的API函数:MemCopy或者RtlMoveMemory</P>/ b1 o9 M+ Q- L; Y7 o  t
<>第四,尽量 不要使用ActiveX控件
; h& I5 I6 J0 N& C: R& \/ S除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,6 X7 S+ @( N; L  L
例如类。这两者之间的效率有很大差异。
$ L9 A/ i7 r* C1 j/ N如果你设计的ActiveX对象不涉及到用户界面,就使用ActiveX DLL代替控件( A* V' F' `: Z# Y
在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,, s4 P# O4 i3 L; }! v2 {
然后再加入工程中。我建议你最好不要这样做,# X3 E' @  Y( I: z$ R+ k( k
因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。1 q1 c' `; U) U
每当你调用方法或存取属性的时候,都会浪费大量的系统资源。
! e' K. n$ t- H6 o如果你有ActiveX控件或DLL的源<a href="http://hackbase.com/hacker" target="_blank" >代码</A>,将它们作为工程的私有对象。</P>7 `% }9 i7 r; |) s" T& o/ U4 j& \3 H
<>第五,减少模块的数量
$ B& ?) ~7 H- l  v* l+ N2 e有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。( o! d3 Z) T' y' w
但是在一个模块中只写上二三十行<a href="http://hackbase.com/hacker" target="_blank" >代码</A>就有些可笑了。; C( }" D6 G! P$ F  i  W
如果你不是非常需要模块,尽量不要使用它。这
% v' E! U# [2 U+ F( @: @样做的原因是因为只有在模块中的函数或变量被调用时,
" b& p/ U4 [$ m- _1 b$ `0 W( [# OVB才将模块加载到内存中;当VB应用程序退出时,1 n8 f: M! Q3 F0 ^* L7 j! B
才会从内存中卸载这些模块。如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中只有一个模块,  i2 p9 Q8 K. D. P) [
VB就只会进行一次加载操作,这样<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率就得到了提高;
! A$ N  a9 W% T+ F3 v1 f0 w) w( O! c反之如果<a href="http://hackbase.com/hacker" target="_blank" >代码</A>中有多个模块,VB会进行多次加载操作,<a href="http://hackbase.com/hacker" target="_blank" >代码</A>的效率会降低。</P># p' N7 w- E5 e( f4 J
<>第六,减少图片的使用- I/ C/ t1 S) y( j
图片将占用大量内存,而且处理图片也需要占用很多CPU资源。
0 K) e0 e4 u$ C' z1 f* K- l6 }在<a href="http://down.hackbase.com/" target="_blank" >软件</A>中,如果可能的话,3 P, R0 N% i% i$ D
可以考虑用背景色来替代图片,这个我常用,呵呵~~</P>1 O% g5 \! B. G" J
<>第七,其他的一些小<a href="http://hackbase.com/network/network" target="_blank" >技巧</A>2 l) e1 o  Q5 H7 Z! n
1,判断字符串是否为空
  L7 b+ T* e8 `8 z, N检查字符串是否为空时一般使用这种方法
2 x2 m. i+ ]9 g& T* K0 _( i5 cIf Text1.Text = "" then. E" a# f& G- |
end if0 ?0 s( b! h  O/ D: h2 v
如果使用( t1 Q/ C# S. H, X% ^
If Len(Text1.Text) = 0 then
* e$ s, D7 W( k+ r$ x+ y, c# E8 ]end if ! L" F, ?- |$ @  I
效率会大大提高" _# J7 h0 }7 i4 p: v! e
2,多使用With语句引用对象" D; g$ p" J7 O8 S
3,单独定义和分配对象
7 B& E. |' L' v3 `# M定义对象和分配数值可以使用联合语句:Dim obj As New MyClass。但是这要比以下2个单独的语句运行速度慢:6 I* d0 W8 j4 o% t- i  q
Dim obj As MyClass 8 Y) x4 ^2 [" b1 O8 V5 y5 Y8 R
Set obj = New MyClass9 f' @' ~* S- ^0 Q3 W  U1 R. K
4,使用Move方法7 I- f  @& q3 q9 H- r3 i/ t0 E
在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性,如果使用Move方法代替,效率会提高很多, D3 [7 H* |' D
比如
$ m) m6 p) u5 \4 t2 h" XImage1.Width = 100
9 L! i' J6 R2 c1 w! DImage1.Height = 100
0 L0 i7 P$ x) d1 ~1 l5 M# U0 hImage1.Top = 0/ c6 w; q+ z/ K" c
Image1.Left = 07 o; |0 E  E6 i" O2 Z, o/ x2 x
就可以使用Image1.Move 0,0,100,100 代替</P>
  C/ e$ ?* `: E0 Q9 H<>第八,算法优化
$ N8 e5 k% s, O! T尽可能不要使用平方根运算
2 w. H' O% x) |实践证明,使用平方根运算将耗费很多的运行时间。+ G+ t9 ^5 P6 N/ U% S
比如:宁可使用语句If a * a + b * b = 4 Then ...,
$ s6 K: a* e/ V1 _而不要使用达到同等目的的命令If Sqr(a * a + b * b) = 2 Then ...。</P>; K# {2 I/ i% Q  v4 o3 e! S3 H
<>写了一夜了,也就是把自己以前的一点<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>总结一下,当然还有许多方法一时也想不起来了
" A" o! V$ q* n. X我会在想到过找到这方面的信息时再继续哦,希望大家也能把自己的相关<a href="http://hackbase.com/game/jy" target="_blank" >经验</A>补充一下
4 Z: }# E. d& l& S5 ~另外我写的如果有原则性错误也欢迎大家批评指正,这里先谢谢了~~
6 J6 L5 U  q" T/ @我去睡觉了。。。-_-</P></FONT>
作者: xShandow    时间: 2004-10-8 16:23
<>我个人觉得VB代码的整体结构性并不是很紧凑。有些时候甚至表现为语法的不严格。</P>
作者: ggyang    时间: 2009-12-7 21:40
多谢分享,很多问题还没遇到!!!!!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5