你的位置:创意公社- ideaer >> >> 程序开发 >> 详细内容 在线投稿

VisualBasic┊编写高质量的VB代码

排行榜 打印 发给朋友 举报 发布者:nj3784
热度873票  浏览152次 【共0条评论】【我要评论 时间:2011年1月15日 23:54

#Yj;V1t@6cl+G]i1简介: 本文描述了如何通过一些技术手段来提高vb代码的执行效率。(对想提高vb的技术同学很有帮助哦)这些手段可以分为两个大的部分:编码技术和编译优化技术。在编码技术中介绍了如何通过使用高效的数据类型、减少外部引用等编程手段来提高代码执行速度,减少代码消耗的系统资源。在编译优化技术中介绍了如何正确地利用vb提供的编译选项对在编译时最后生成的可执行文件进行优化。创意公社- ideaerQcT&b f7A)SaD ?

创意公社- ideaerv.^t\xy6y+ogo

   前言创意公社- ideaerzS7o+^1^ D S

-Ec;J'S~1?*Hf#Aj1创意公社- ideaerZ,yp9Lz1PS| N

创意公社- ideaerDe"e/h2LY)Yp n

  什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源。这篇文章汇集了作者在使用vb进行软件开发时积累下来的一些经验,通过一些简单的例子来向你展示如何写出高效的vb代码。其中包含了一些可能对vb程序员非常有帮助的技术。在开始之前,先让我陈清几个概念。创意公社- ideaer}hPo#~X

创意公社- ideaer4i U X*C Q!K

ueH&?G:F~3P1 创意公社- ideaer:a{~I{

  让代码一次成型:在我接触到的程序员中,有很多人喜欢先根据功能需求把代码写出来,然后在此基础上优化代码。最后发现为了达到优化的目的,他们不得不把代码再重新写一遍。所以我建议你在编写代码之前就需要考虑优化问题。创意公社- ideaer$OA,]}N$D0OXg0z

3XPec(L!B:MG1

C$k+m5^Ft\1 创意公社- ideaer3C Q)w S [.zy"~

  把握好优化的结果和需要花费的工作之间的关系:通常当完成了一段代码,你需要检查和修改它。在检查代码的过程中,也许你会发现某些循环中的代码效率还可以得到进一步的改进。在这种情况下,很多追求完美的程序员也许会立马修改代码。我的建议是,如果修改这段代码会使程序的运行时间缩短一秒,你可以修改它。如果只能带来10毫秒的性能改进,则不做任何改动。这是因为重写一段代码必定会引入新的错误,而调试新的代码必定会花掉你一定的时间。程序员应该在软件性能和开发软件需要的工作量之间找一个平衡点,而且10毫秒对于用户来说也是一个不能体会到的差异。创意公社- ideaerCGSu J A l+^y

创意公社- ideaervn DQ p1_] r

0F+Y&m+XjK+D1 创意公社- ideaer%T!e'y7\g$p(J

  在需要使用面向对象方法的时候尽量使用它;vb提供的机制不完全支持面向对象的设计和编码,但是vb提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能,这一点我会在后面的例子中详细说明。

+w)D2e*^w,HA"|6o1 创意公社- ideaerE:DXk v.S#a

创意公社- ideaer)pm6pa|,cO

\dH.[$w0v,l-E2N1  当你编写vb代码的时候,希望你能把上面几点作为指导你编码的原则。我把文章分为两个部分:如何提高代码的运行速度和编译优化。创意公社- ideaer B.~~(]7N~(a

创意公社- ideaer]t.DGYtW$vE5w

;F}Vp-HF(M'[(M^'w1

!w JO(x.f n5YT`1  如何提高代码的运行速度创意公社- ideaerGO t Hq Hvw

]/b@m `1创意公社- ideaer `/Lg7g?w8ty

创意公社- ideaer"{2A3}K0ez!q8B

  下面的这些方法可以帮助你提高代码的运行速度:创意公社- ideaer0S8D8C"b/q"Z1[*e!Kx1Qi

S7` A6Y2X*j R1

)o5Ay&T*s/X+N:hb1 创意公社- ideaer6ay0r zI1u

  1. 使用整数(integer)和长整数(long)

4q2v q#g DB1 创意公社- ideaer ZSL3phJ

创意公社- ideaerI.@6Zxz},d|2x

创意公社- ideaer R.T T ib7U

  提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将single,double和currency类型的变量替换为integer或long类型的变量,因为vb处理integer和long的能力远远高于处理其它几种数据类型。创意公社- ideaer6N0r{Qz)N2GWY

创意公社- ideaerI~#O)B G4d

创意公社- ideaer+L*]X1Tiz

创意公社- ideaerT ~%u UI7P

  在大多数情况下,程序员选择使用single或double的原因是因为它们能够保存小数。但是小数也可以保存在integer类型的变量中。例如程序中约定有三位小数,那么只需要将保存在integer变量中的数值除以1000就可以得到结果。根据我的经验,使用integer和long替代single,double和currency后,代码的运行速度可以提高将近10倍。创意公社- ideaerD[n%m#~']q5a

Y-a$c:j v:w0@*@1创意公社- ideaer0~e,lW8`!n0AG

创意公社- ideaer4N4]7`U G8Gcc'Fx

  2. 避免使用变体创意公社- ideaer~8T,Avb[

创意公社- ideaerBv?(~[-H&D f

创意公社- ideaer(dn"O8DwB

z&{$b}W rp7u(P7D1  对于一个vb程序员来说,这是再明显不过的事情了。变体类型的变量需要16个字节的空间来保存数据,而一个整数(integer)只需要2个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。

a%f:l)F~q n1

W!I+|m'o ~4yx)C1创意公社- ideaer)bY/]k|u

创意公社- ideaerw\xI8H1Cz$C!X

  在这里顺带提一句,对于object对象也存在同样的问题。请看下面的代码:创意公社- ideaer3|9y0@S N/M

创意公社- ideaerd*`5ChwD

创意公社- ideaer$^9Qk1Y\

创意公社- ideaer9_A'u Cy:}

dim fso
^#r-\FJ1set fso = new scripting.filesystemobject

hl|f*v_#rZ1 创意公社- ideaerQd+Suar Eho&h

创意公社- ideaer:{WIkxg

创意公社- ideaer.N bd%~K7u~

  或

0W;w;G+Hxl [u1 创意公社- ideaer'md/~C{j

fs ](B"Kzf'd1 创意公社- ideaer0U+lsX ab"BIpV

dim fso as object
]CTS6h5W1set fso = new scripting.filesystemobject

o*W&^_)[kp'k|.~1 创意公社- ideaerQR)u K.M@ ry;H-e

创意公社- ideaer}2Ixz{'`

D'UErlqA"W3_1  上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和cpu时间。正确的代码应该象下面这样:创意公社- ideaerT`$U$BY

Wu rRU1

$B} ]5Kt1 创意公社- ideaerb/d:ShS3d

dim fso as new filesystemobject
,U6e }%\k#D6?13. 尽量避免使用属性

*aT-d6OW9[X1

9o w1EV)VP)il\X&D7F2}1

{*L yz'pDJ1

,Y@[ w9F3wm H1  在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:

htuavm&sh1

'M5KH0o2`)n\1创意公社- ideaer.}fxvO9\z3Wbs

创意公社- ideaerX yd+HXJFZt

dim intcon as integer创意公社- ideaer(R%k9]0^ uWWX
for intcon = 0 to ubound(somvar())
ay+| |@E+g U1text1.text = text1.text & vbcrlf & somevar(intcon)
!DrJ]r F"^BSgO-r1next intcon

3j'S@4^,l%P1

3d)SV$X5uX;F p5X1创意公社- ideaer:K;N8~*y+v%t Y

E }@5D4d^5YF1jOG*D1  下面这段代码的执行速度是上面代码的20倍。 创意公社- ideaerDkq L0~`

"d:TEO u+f~p|-m1

M3j"wZ#u x9E1

v(LU+k8s%S"|Zk1dim intcon as integer
!h N%f4P IeP G1dim soutput as string
dmpU#[d+|9M}1for intcon = 0 to ubound(somevar())
t H4p;l4e T(PiM1soutput = soutput & vbcrlf &
|0SZ!Q4NyM1somevar(intcon)创意公社- ideaer&BBc2gVa'p^|D
next
+o}ud;RX M"t~'a0}1text1.text = soutput 创意公社- ideaer7d,v\5~l

创意公社- ideaerr$U:?;}P^ g

'a9V)nly!FCi1 创意公社- ideaer S'_5r}$g;~

  4. 尽量使用数组,避免使用集合创意公社- ideaer(T'n&[s.A@-S

!]iSmR4k ry(R1创意公社- ideaerP*xI1koiQ

wtBz} Q}O{1  除非你必须使用集合(collection),否则你应该尽量使用数组。据测试,数组的存取速度可以达到集合的100倍。这个数字听起来有点骇人听闻,但是如果你考虑到集合是一个对象,你就会明白为什么差异会这么大。创意公社- ideaergK&bs6~

创意公社- ideaer;fX#z7N9L:[

2s?+_Wc6Rf^'^/Ae1

{Up-lK1  5. 展开小的循环体创意公社- ideaerd f"u,{7wmj

创意公社- ideaer2t iZ@hy ]/Tm:En

创意公社- ideaer7dP Y5[f U

创意公社- ideaer IIt/bARVw

  在编码的时候,有可能遇到这种情况:一个循环体只会循环2到3次,而且循环体由几行代码组成。在这种情况下,你可以把循环展开。原因是循环会占用额外的cpu时间。但是如果循环比较复杂,你就没有必要这样做了。

E*VN I4Ly1 创意公社- ideaer0dH?RC

Q @O-p!vI?"p-K1 创意公社- ideaer3[:gMi8ig_

  6. 避免使用很短的函数创意公社- ideaer#vC9A[d }Bk%C

创意公社- ideaer Tr'E e6fo&i

F]3s)j5W1

5D*gw&J{$XB\i1  和使用小的循环体相同,调用只有几行代码的函数也是不经济的–调用函数所花费的时间或许比执行函数中的代码需要更长的时间。在这种情况下,你可以把函数中的代码拷贝到原来调用函数的地方。

9scI$xrH1

f7~l)}"k/]-Hc1

-X Q/j+VB)D4aT1

"bd m&ueD%z|%G1  7. 减少对子对象的引用创意公社- ideaer sfD^)h;{-O

dSV4|CCr q q'v1创意公社- ideaer/^(YPc j#U*| `3C

`"z}E fly:{1  在vb中,通过使用.来实现对象的引用。例如:创意公社- ideaer0gM#m m RE~E N

`i6`:c!y+kSh1sP#Q1

g#X*x]U2c6d1

;]:r6E5~-G,h5N1form1.text1.text

f1g F8qU:[1

#RwZHS3n {,PA7?h1创意公社- ideaer,JgLZ wi%\

Tu/O\Y*Xi3N1  在上面的例子中,程序引用了两个对象:form1和text1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。程序员唯一可以做就是使用with或者将用另一个对象保存子对象(text1)。创意公社- ideaerF%m,kC0Y

K!Pm{+r%Ne [1创意公社- ideaer/TPy7H5u^"R XW

创意公社- ideaeryu.Fz!c*a

‘ 使用with
*hF#of3J T!x1with frmmain.text1
fJj i+mmT1.text = “learn vb”
$q9mR!y_1[5H5B1.alignment = 0创意公社- ideaer8l0lpMQ7p
.tag = “its my life”创意公社- ideaer(OdEj&K'a^v
.backcolor = vbblack
wR u)Gil+[1.forecolor = vbwhite
6BMcjxa5A1end with 创意公社- ideaer _W2YI4G0W

7g.| GWRUg0JEn1

&@A[u/V1

a,dU1\?-{;t8LG1  或者 创意公社- ideaer+?Jy%_%I ~

q IoYN1创意公社- ideaerhTq4M|^k7`4e2cm

创意公社- ideaerh~2g%p,t#Js

’ 使用另一个对象保存子对象
w(AoTb4Fg"c2~'B Fj1dim txttextbox as textbox
.`|4d*s F;[F0K1set txttextbox = frmmain.text1创意公社- ideaer4|/g9T!R3j9u
txttextbox.text = “learn vb”
G8MV8tF\8A1txttextbox.alignment = 0
9Gj j"Z+t%G1txttextbox.tag = “its my life”创意公社- ideaer c fGL)Ah,c
txttextbox.backcolor = vbblack创意公社- ideaer$uG:yq0q$q
txttextbox.forecolor = vbwhite

1`7e-bW+PP%O{M1

M$U1[D ?P Z1创意公社- ideaer3c0i)y*qb ^%a

创意公社- ideaerO8w:r(Wj

  注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:

4SY Oo$?^%Mfc;]~1 创意公社- ideaer MJ[o;{p Gc

创意公社- ideaer?-j:|v7R+z,`'[(t

!VVT B%d4b7A|?*F(d&RY1with text1创意公社- ideaer!sQr!^&h#| d
.text = “learn vb”创意公社- ideaerte&`1n%qc8r6d
.alignment = 0创意公社- ideaer8Uug8Q C Di ?8I
.tag = “its my life”
h$hM#fN1h1.backcolor = vbblack
.Q KdyWUjbR1.forecolor = vbwhite创意公社- ideaerAZ&kE]
end with

Jm o;ie,`1 创意公社- ideaerBP&nEuK

2B&x!` }i&[ UVd1 创意公社- ideaer$q0]I9c/c'b

  很不幸的是,我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是with块编译后会形成一个分枝,会增加了额外的处理工作。

^ N\y7y&])p}kDtw1

qaY#iv8B5S`G1创意公社- ideaer*@v M k5M

L MT8i&w'C8bP1  8. 检查字符串是否为空

E6V*sLW-Q Y\8U;r1

4R.~|-@j"M h1创意公社- ideaerw5gQHY(u+^f

a$v [O5F sB K%j1  大多数程序员在检查字符串是否为空时会使用下面的方法:创意公社- ideaer+L3Y@8u v_Y.Fe

创意公社- ideaer9lU1e*}z(K WR'W]

j,_NE@ag1 创意公社- ideaer(P*R.Y h!DW

if text1.text = “” then创意公社- ideaer%EJ%B;Ke2D
‘ 执行操作创意公社- ideaer6G,ye n%v
end if 

m&IF\4s7~n1

r+h!rQ@.^`2y1

~^+x]0[O dT1 创意公社- ideaer5_-M+YlW&zlh%m

  很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:创意公社- ideaery(Q hm5d7~/AQ_

)Fe/k E7B_ZQK3r z2z/N1

"Dw]"T c(^R4][9C"@1 创意公社- ideaer4^5Q1dS%M7T0@

if len(text1.text) = 0 then创意公社- ideaer4PE:W.B8N/p
’ 执行操作
Je6H:PT(OS1end if

!hwI9IS)W3{2X1 创意公社- ideaer#a P(C'bk ? X{ T

5@FH)X6z1 创意公社- ideaer F eXh2D*]g

  9. 去除next关键字后的变量名

(J#}2u*sW)y%v1

8LC8X6qu TW s1

7`y0^L2a([1

s7_1s*k PHT!y8n1  在next关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是一个经验而已。不过我想很少有程序员会这样画蛇添足,毕竟大多数程序员都是惜字如金的人。

/u*\E'ST'M7W#yH7A1 创意公社- ideaer1E:_V%UgkLc

创意公社- ideaer$N(RU6i%J.Z

HP_?X(~?,E1‘ 错误的代码创意公社- ideaer~WOv-MpD7lm)q
for icount = 1 to 10
i&dR!d]N1’ 执行操作
H)u2Re'aLQ1next icount创意公社- ideaereL1XD/q k
‘ 正确的代码
lC?iq/@1for icount = 1 to 10
2S7B7I9~*O'p O1’ 执行操作创意公社- ideaer!?\.} uK
next 

{z&b!R5b.E$Q1 创意公社- ideaer.} RAaQv u$e

7s6sC(_K+N ]1

\? k)`p:M$B,["z1  10. 使用数组,而不是多个变量

6uIb-m5P2i]}O1 创意公社- ideaer,G:uwwt v,ar2z

I)nCYi Whpz1

8~*]#Wh.x"t1bxt1  当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在vb中,数组是最高效的数据结构之一。创意公社- ideaer@g {&[7Pv8]-?w

创意公社- ideaer Qap|&Z

n+zM7j/@%X1

3T:z%S U8p @ ?1  11. 使用动态数组,而不是静态数组

9|Z9q S;s Fh o"q1

)z8fV Q+k Z tc1

,d(s+vG!G|P$_1

.n;KO*r9M6Q-?kfZ1  使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。

c ?h#r4f(h1

it'U0T k1

]:o9PSv Tg;a{1

^8\k;\O7D,y` \1  12. 销毁对象创意公社- ideaert?f` Ckx

创意公社- ideaer1}x:js V1S#Ze

创意公社- ideaer(]y;uZ?~-m5rv1Z

创意公社- ideaerbc C'G{g

  无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:创意公社- ideaer+? Q*Sd4f:nD [[.K

%GVT3?O1

t.lr2t]&B.r1

g.p`5B.z }2H#W1dim fso as new filesystemobject创意公社- ideaerq nu.\HZ[
‘ 执行操作
pogBpX&Pta e#d1’ 销毁对象
}^\ L |6Zc&_%|1set fso = nothing创意公社- ideaer8M3L+u#f$E
对于窗体,可以进行卸载:
t*I+juH'Z^6S$GB5F1unload frmmain  创意公社- ideaer2`W}:}3E2r

Ke+EI(}lM,Et1

eD h&Qb8Lm$L*jJ1

p[#fY2A1gfGj9B.N1  或创意公社- ideaerx!`:uJp3A

k ^&b`3l/\,_1

X ~(D.?h{f(p"Y,o1

0l n$wO%q7~Q1set frmmain = nothing

)M`9O7sbn1

0_$uX&]8Vcz{NXC1

m2e*\7o vM}h1 创意公社- ideaerF:\5f1b;n6RW

  13. 变长和定长字符串

8~Ef+jG'^9rL+V+T6c1 创意公社- ideaer;@*nM ];L1R1u)qD

创意公社- ideaerZ:_6] XWl&\

创意公社- ideaer X6k:j$q2fN5D2N;[.?

  从技术上来说,与变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下,你都需要调用trim函数以去除字符串末的空字符,这样反而会降低代码效率。所以除非是字符串的长度不会变化,否则还是使用变长字符串。

cQ VHuB8U u;W1 创意公社- ideaerv+o]].S

?R/ecgyA1

N+`8hHr7}1  14. 使用类模块,而不是activex控件创意公社- ideaer8p LY1s3xaiZ

创意公社- ideaereG!{zP)Q.W

0Un4\|f q/al9\4GX1 创意公社- ideaerPnW p Rk:q

  除非activex控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。创意公社- ideaerR3m+O oo gz

NE&aO-KIm;R1

MaX"XA'_]1

yj8w$iw O1  15. 使用内部对象

7x.C6sQ$m(N1

Cl{sp\~"ig1

;[v#stK1

^9m#z%u|z9Lz Y1  在涉及到使用activex控件和dll的时候,很多程序员喜欢将它们编译好,然后再加入工程中。我建议你最好不要这样做,因为从vb连接到一个外部对象需要耗费大量的cpu处理能力。每当你调用方法或存取属性的时候,都会浪费大量的系统资源。如果你有activex控件或dll的源代码,将它们作为工程的私有对象。创意公社- ideaer&v+M;t)\8Y-D

]-wgo_-i7lQs1

Q2\:ph5r&U$[L{0J1

&J0r,rD/T\?1  16. 减少模块的数量创意公社- ideaer T*VX-m-~!NqI:m

~2MJ7i[aQ1

9q AA!A;y(O)x4F1 创意公社- ideaer6I)} O,x0a'@'K;I9j-]8E

  有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。如果你不是非常需要模块,尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量被调用时,vb才将模块加载到内存中;当vb应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,vb就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,vb会进行多次加载操作,代码的效率会降低。

%T@?g!T1j@ K+K/I1 创意公社- ideaerP;_'Iq{Y/J*k

X`f^:t:^%U8T1

J \X)Z ws ]C1  17. 使用对象数组

q v'x@v2m1 创意公社- ideaer4a_/@$r Rf*?

创意公社- ideaerPE^!Yc

创意公社- ideaer;u|GIW |O

  当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个picturebox,每个picturebox都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个picturebox,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。

NI1y$TH*f0]{1

Z$w1r.h_-bu+e2x1创意公社- ideaeru2Y'L_ y6v*w

A kM4HD%Gox!u3oH1  18. 使用move方法

R$x+zS j0p1 创意公社- ideaerY2I1v)mc(f

SI1Xnm{};_7?1

[-mO ZO y9N1  在改变对象的位置时,有些程序员喜欢使用width,height,top和left属性。例如:创意公社- ideaerv\W:G"E,L VU

;U%X3Mg(g^Q)N1

)n0t|#n C5Rn#K1 创意公社- ideaer'k%e5U{FM[

image1.width = 100创意公社- ideaeri,k p U ` K(X
image1.height = 100创意公社- ideaer/|9W x|#EB0L1D
image1.top = 0
`9C|1lGG-Sz1image1.left = 0 创意公社- ideaerDz3d f8vG9Q|

创意公社- ideaer[c/R Wh"El

)EX%q:@(u[m`%`1 创意公社- ideaer9\6|mM%t bw'aM'L Z

  实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用move方法:创意公社- ideaer(?l-d*]5at

}FV R FQ-Ps1创意公社- ideaer?8lE3DQw_z2e_4l

创意公社- ideaer%@3qUR\

image1.move 0,0,100,100 创意公社- ideaeru}g(v{n:`o-G

)r6]j!g.Z| TKXjT1创意公社- ideaer_IA0Q c*X.vQ x

创意公社- ideaer4z] hq o

  19. 减少图片的使用

KJW3D4C$st3P|:g/U1 创意公社- ideaer.Z9Hht?Qh&_

F1siD!H Yu}(|!r,u Z1

(ba6GYR9m6oN,Ici1  图片将占用大量内存,而且处理图片也需要占用很多cpu资源。在软件中,如果可能的话,可以考虑用背景色来替代图片–当然这只是从技术人员的角度出发看这个问题。创意公社- ideaer7I4Ae s-E)n\Du+I9zj

(\K D"dF1}r,v @1

;p(b)U}O\+n1U[I1 创意公社- ideaerq?7Tuo(R#K`+r Zm

  20. 使用activex dll,而不是activex控件

"B-j]4dz,f4_1 创意公社- ideaer S-u\s3AM N

BG ]"aRd&]1 创意公社- ideaer.q ] NKW9s

  如果你设计的activex对象不涉及到用户界面,使用activex dll。创意公社- ideaerS }^1t0Zl'\5CU N
编译优化创意公社- ideaer:u-x.w-bN

@%@.r`}#L7]0M1

$gv$LL4Ig*X1

'V ~w;Y/y3_1  我所见过的很多vb程序员从来没有使用过编译选项,也没有试图搞清楚各个选项之间的差别。下面让我们来看一下各个选项的具体含义。创意公社- ideaerd;n N9J2x/U y{S3S7V

创意公社- ideaerU2Z8t$V2j8Z'f

创意公社- ideaerF@fP+r`*_h

创意公社- ideaer W'@\-n%w0W

  1. p-代码(伪代码)和本机代码

*pB ? w:^#vxF1

0|vPc}1

.j|.f%Sv)@1

9{P?.d0xy$@1  你可以选择将软件编译为p-代码或是本机代码。缺省选项是本机代码。那什么是p-代码和本机代码呢?
|\Vj0xV8`1p-代码:当在vb中执行代码时,vb首先是将代码编译为p-代码,然后再解释执行编译好的p-代码。在编译环境下,使用这种代码要比本机代码快。选择p-代码后,编译时vb将伪代码放入一个exe文件中。

(ah5G0QS2J/n$B.w1

j:^;p i.FM1创意公社- ideaer V I1s4K4} wba*[

0[ L)I)BJ;Y1  本机代码:本机代码是vb6以后才推出的选项。当编译为exe文件后,本机代码的执行速度比p-代码快。选择本机代码后,编译时vb使用机器指令生成exe文件。创意公社- ideaer(Q8G;| kL8GH

F i Y"W:v&q1

+?2F_$~"wR)W[;m1

3xa#k5i"S0f-e;W1j1  在使用本机代码进行编译时,我发现有时候会引入一些莫名其妙的错误。在编译环境中我的代码完全正确地被执行了,但是用本机代码选项生成的exe文件却不能正确执行。通常这种情况是在卸载窗口或弹出打印窗口时发生的。我通过在代码中加入doevent语句解决了这个问题。当然出现这种情况的几率非常少,也许有些vb程序员从来没有遇到过,但是它的确存在。

4]5X%O$K2q;M,}7gpD1 创意公社- ideaer:D'DF#?1R ?Lc:gi

FHHAd5ntd)uzx1 创意公社- ideaerPY T$q w&{#I

  在本机代码中还有几个选项:

8t/t:`9d/Oc6B)q:G Pg4q1 创意公社- ideaerH*W&O5x6SQ^8~

WV#f"NJ#v1

4B3O5o ?(I&hCjXP6x1  a) 代码速度优化:该选项可以编译出速度较快的执行文件,但执行文件比较大。推荐使用创意公社- ideaerr.rjl&EN'\%I

Xx }~"r5O1创意公社- ideaer-RQ_uV

创意公社- ideaer5fe`_mk`

  b) 代码大小优化:该选项可以编译出比较小的执行文件,但是以牺牲速度为代价的,不推荐使用。创意公社- ideaeruXM)c Ak*M

SM-e8Y,X1

QY%r4R8s C#L1 创意公社- ideaercQ jPWY tA

  c) 无优化:该选项只是将p-代码转化为本机代码,没有做任何优化。在调试代码时可以使用。创意公社- ideaerS3r'_/]KVF#\o

5{#JX_.J4QT ?E{D3q1

p:m}]u9f1

D l e ].E{3T1  d) 针对pentium pro优化:虽然该项不是本机代码中的缺省选项,但是我通常会使用该选项。该选项编译出的可执行程序在pentium pro和pentium 2以上的机器上可以运行得更快,而在比较老的机器上要稍稍慢一些。考虑到现在用pentium 2都是落伍,所以推荐大家使用该选项。创意公社- ideaer6E[y.wS7s#S$?

['[!x&Z)^!iyn@1创意公社- ideaerTc g}'i*gbR:[O`

创意公社- ideaer T1V2z{ys#D O

  e) 产生符号化调试信息:该项在编译过程中生成一些调试信息,使用户可以利用visual c++一类的工具来调试编译好的代码。使用该选项会生成一个.pdf文件,该文件记录了可执行文件中的标志信息。当程序拥有api函数或dll调用时,该选项还是比较有帮助的。

vE8d2Q+K#tTB1

^/Qmz7{Ij Qq1

-N0nu"V!}1 创意公社- ideaer1E-L }P obBWA

  2. 高级优化创意公社- ideaer7GWe,t$Y2s8`.|y6j

创意公社- ideaerM2? \'~$~

%V8aS-za~4D1

m$s6W%l)df9h1  高级优化中的设置可以帮助你提高软件的速度,但是有时候也会引入一些错误,因此我建议大家尽量小心地使用它们。如果在代码中有比较大的循环体或者复杂的数学运算时,选中高级优化中的某些项会大幅度提升代码的性能。如果你使用了高级优化功能,我建议你严格测试编译好的文件。创意公社- ideaer/H5J!c tZyg+S

创意公社- ideaer3G3Mn4Dq

创意公社- ideaerO@{3gE-I7B

创意公社- ideaer? `^Wn.o/TGno

  a) 假定无别名:可以提高循环体中代码的执行效率,但是在如果通过变量的引用改变变量值的情况下,例如调用一个方法,变量的引用作为方法的参数,在方法中改变了变量的值的话,就会引发错误。有可能只是返回的结果错误,也有可能是导致程序中断运行的严重错误。创意公社- ideaer-O2PH(`BJ%C9G!s4x

{LyouO;OdA#H u1

?'F(A\n c1`1

!a#laNG4V7T1  b) 取消数组绑定检查、取消整数溢出检查和取消浮点错误检查:在程序运行时,如果通过这些检查发现了错误,错误处理代码会处理这些错误。但是如果取消了这些检查,发生了错误程序就无法处理。只有当你确定你的代码中不会出现上面的这些错误时,你才可以使用这些选项。它们将使软件的性能得到很大的提升。

-T2k9V!MMV f D1

:k~1G$Oh q1创意公社- ideaeru8Ms$dT1aC

创意公社- ideaerD%o!}s7Z

  c) 允许不舍入的浮点操作:选择该选项可以是编译出来的程序更快地处理浮点操作。它唯一的缺点就是在比较两个浮点数时可能会导致不正确的结果。

y z y0x;}^t1H1 创意公社- ideaerK6XY#orx

创意公社- ideaer}-OAv.qL1u XQ

,wr YX!F#sSz L1  d) 取消pentium fdiv安全检查:该选项是针对一些老的pentium芯片设置的,现在看来已经过时了。

{9T"g m0p7e(V ]E*SzL5g1
顶:47 踩:39
对本文中的事件或人物打分:
当前平均分:-0.55 (297次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.49 (235次打分)
【已经有255人表态】
43票
感动
20票
路过
33票
高兴
31票
难过
27票
搞笑
37票
愤怒
31票
无聊
33票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】