G>介绍:
本文描述了如何通过

些技术手段来提高VB代码

执行效率

这些手段可以分为两个大

部分:编码技术和编译优化技术

在编码技术中介绍了如何通过使用高效

数据类型、减少外部引用等编程手段来提高代码执行速度

减少代码消耗

系统资源

在编译优化技术中介绍了如何正确地利用VB提供

编译选项对在编译时最后生成

可执行文件进行优化
前言 什么是

个高效

软件Software?

个高效

软件Software不仅应该比实现同样功能

软件Software运行得更快

还应该消耗更少

系统资源

这篇文章汇集了作者在使用VB进行软件Software开发时积累下来


些经验

通过

些简单

例子来向你展示如何写出高效

VB代码

其中包含了

些可能对VB

员非常有帮助

技术

在开始的前

先让我陈清几个概念

让代码

次成型:在我接触到


员中

有很多人喜欢先根据功能需求把代码写出来

然后在此基础上优化代码

最后发现为了达到优化

目


他们不得不把代码再重新写

遍

所以我建议你在编写代码的前就需要考虑优化问题

把握好优化

结果和需要花费

工作的间

关系:通常当完成了

段代码

你需要检查和修改它

在检查代码

过程中

也许你会发现某些循环中

代码效率还可以得到进

步

改进

在这种情况下

很多追求完美


员也许会立马修改代码

我

建议是

如果修改这段代码会使


运行时间缩短

秒

你可以修改它

如果只能带来10毫秒

性能改进

则不做任何改动

这是

重写

段代码必定会引入新



而调试新

代码必定会花掉你

定

时间


员应该在软件Software性能和开发软件Software需要

工作量的间找

个平衡点

而且10毫秒对于用户来说也是

个不能体会到

差异

在需要使用面向对象思路方法

时候尽量使用它;VB提供

机制不完全支持面向对象

设计和编码

但是VB提供了简单

类

大多数人认为使用对象将导致代码

效率降低

对于这

点我个人有些区别

意见;考察代码

效率不能纯粹从运行速度

角度出发

软件Software占用

资源也是需要考虑

原因的


使用类可以帮助你在整体上提升软件Software

性能

这

点我会在后面

例子中详细介绍说明

当你编写VB代码

时候

希望你能把上面几点作为指导你编码

原则

我把文章分为两个部分:如何提高代码

运行速度和编译优化
如何提高代码
运行速度 下面

这些思路方法可以帮助你提高代码

运行速度:
1. 使用整数(Integer)和长整数(Long)
提高代码运行速度最简单

思路方法莫过于使用正确

数据类型了

也许你不相信

但是正确地选择数据类型可以大幅度提升代码

性能

在大多数情况下


员可以将Single

Double和Currency类型

变量替换为Integer或Long类型

变量


VB处理Integer和Long

能力远远高于处理其它几种数据类型

在大多数情况下


员选择使用Single或Double

原因是

它们能够保存小数

但是小数也可以保存在Integer类型

变量中

例如

中约定有 3位小数

那么只需要将保存在Integer变量中

数值除以1000就可以得到结果

根据我

经验

使用Integer和Long替代Single

Double和Currency后

代码

运行速度可以提高将近10倍

2. 避免使用变体
对于

个VB

员来说

这是再明显不过

事情了

变体类型

变量需要16个字节

空间来保存数据

而

个整数(Integer)只需要2个字节

通常使用变体类型

目

是为了减少设计

工作量和代码量

也有


员图个省事而使用它

但是如果

个软件Software经过了严格设计和按照规范标准编码

话

完全可以避免使用变体类型

在这里顺带提

句

对于Object对象也存在同样

问题

请看下面

代码:
Dim FSO
Set FSO = New Scripting.File

Object
或
Dim FSO as object
Set FSO = New Scripting.File

Object
上面

代码由于在申明

时候没有指定数据类型

在赋值时将浪费内存和CPU时间

正确

代码应该象下面这样:
Dim FSO as New File

Object
3. 尽量避免使用属性
在平时

代码中

最常见

比较低效

代码就是在可以使用变量

情况下

反复使用属性(Property)

尤其是在循环中

要知道存取变量

速度是存取属性

速度

20倍左右

下面这段代码是很多

员在

中会使用到

:
Dim

Con as Integer
For

Con = 0 to Ubound(SomVar

)
Text1.Text = Text1.Text & vbcrlf & SomeVar(

Con)
Next

Con
下面这段代码

执行速度是上面代码

20倍
Dim

Con as Integer
Dim sOutput as String
For

Con = 0 to Ubound(SomeVar

)
sOutput = sOutput & vbCrlf &
SomeVar(

Con)
Next
Text1.Text = sOutput
4. 尽量使用


避免使用集合
除非你必须使用集合(Collection)

否则你应该尽量使用


据测试



存取速度可以达到集合

100倍

这个数字听起来有点骇人听闻

但是如果你考虑到集合是

个对象

你就会明白为什么差异会这么大

5. 展开小

循环体
在编码

时候

有可能遇到这种情况:

个循环体只会循环2到3次

而且循环体由几行代码组成

在这种情况下

你可以把循环展开

原因是循环会占用额外

CPU时间

但是如果循环比较复杂

你就没有必要这样做了

6. 避免使用很短


和使用小

循环体相同


只有几行代码


也是不经济

--


所花费

时间或许比执行

中

代码需要更长

时间

在这种情况下

你可以把

中

代码拷贝到原来



地方

7. 减少对子对象

引用
在VB中

通过使用.来实现对象

引用

例如:
Form1.Text1.Text
在上面

例子中


引用了两个对象:Form1和Text1

利用这种思路方法引用效率很低

但遗憾

是

没有办法可以避免它


员唯

可以做就是使用With或者将用另

个对象保存子对象(Text1)

´ 使用With
With frmMain.Text1
.Text = \"Learn VB\"
.Alignment = 0
.Tag = \"Its my l

e\"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
或者
´ 使用另

个对象保存子对象
Dim txtTextBox as TextBox
Set txtTextBox = frmMain.Text1
TxtTextBox.Text = \"Learn VB\"
TxtTextBox.Alignment = 0
TxtTextBox.Tag = \"Its my l

e\"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite
注意

上面提到

思路方法只适用于需要对

个对象

子对象进行操作

时候

下面这段代码是不正确

:
With Text1
.Text = \"Learn VB\"
.Alignment = 0
.Tag = \"Its my l

e\"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸

是

我们常常可以在实际

代码中发现类似于上面

代码

这样做只会使代码

执行速度更慢

原因是With块编译后会形成

个分枝

会增加了额外

处理工作

8. 检查

串是否为空
大多数

员在检查

串是否为空时会使用下面

思路方法:
If Text1.Text = \"\" then
´ 执行操作
End
很不幸

进行

串比较需要

处理量甚至比读取属性还要大

因此我建议大家使用下面

思路方法:
If Len(Text1.Text) = 0 then
´ 执行操作
End
9. 去除Next关键字后

变量名
在Next关键字后加上变量名会导致代码

效率下降

我也不知道为什么会这样

只是

个经验而已

不过我想很少有

员会这样画蛇添足

毕竟大多数

员都是惜字如金

人

´


代码
For iCount = 1 to 10
´ 执行操作
Next iCount
´ 正确

代码
For iCount = 1 to 10
´ 执行操作
Next
10. 使用


而不是多个变量
当你有多个保存类似数据

变量时,可以考虑将他们用

个

代替

在VB中


是最高效

数据结构的


11. 使用动态


而不是静态

使用动态

对代码

执行速度不会产生太大

影响

但是在某些情况下可以节约大量

资源

12. 销毁对象
无论编写

是什么软件Software


员都需要考虑在用户决定终止软件Software运行后释放软件Software占用

内存空间

但遗憾

是很多

员对这

点好像并不是很在意

正确

做法是在退出

前需要销毁

中使用

对象

例如:
Dim FSO as New File

Object
´ 执行操作
´ 销毁对象
Set FSO = Nothing
对于窗体

可以进行卸载:
Unload frmMain
或
Set frmMain = Nothing
13. 变长和定长

串
从技术上来说

和变长

串相比

定长

串需要较少

处理时间和空间

但是定长

串

缺点在于在很多情况下

你都需要

Trim

以去除

串末

空


这样反而会降低代码效率

所以除非是

串

长度不会变化

否则还是使用变长

串

14. 使用类模块

而不是ActiveXControl控件
除非ActiveXControl控件涉及到用户界面

否则尽量使用轻量

对象

例如类

这两者的间

效率有很大差异

15. 使用内部对象
在涉及到使用ActiveXControl控件和DLL

时候

很多

员喜欢将它们编译好

然后再加入工程中

我建议你最好不要这样做


从VB连接到

个外部对象需要耗费大量

CPU处理能力

每当你

思路方法或存取属性

时候

都会浪费大量

系统资源

如果你有ActiveXControl控件或DLL

源代码

将它们作为工程

私有对象

16. 减少模块

数量
有些人喜欢将通用


保存在模块中

对于这

点我表示赞同

但是在

个模块中只写上 2 3十行代码就有些可笑了

如果你不是非常需要模块

尽量不要使用它

这样做

原因是

只有在模块中


或变量被

时

VB才将模块加载到内存中;当VB应用

退出时

才会从内存中卸载这些模块

如果代码中只有

个模块

VB就只会进行

次加载操作

这样代码

效率就得到了提高;反的如果代码中有多个模块

VB会进行多次加载操作

代码

效率会降低

17. 使用对象

当设计用户界面时

对于同样类型

Control控件


员应该尽量使用对象


你可以做

个实验:在窗口上添加100个PictureBox

每个PictureBox都有区别

名称

运行


然后创建

个新

工程

同样在窗口上添加100个PictureBox

不过这

次使用对象


运行


你可以注意到两个

加载时间上

差别

18. 使用Move思路方法
在改变对象

位置时

有些

员喜欢使用Width

Height

Top和Left属性

例如:
Image1.Width = 100
Image1.Height = 100
Image1.Top = 0
Image1.Left = 0
实际上这样做效率很低



修改了 4个属性

而且每次修改的后

窗口都会被重绘

正确

做法是使用Move思路方法:
Image1.Move 0,0,100,100
19. 减少图片

使用
图片将占用大量内存

而且处理图片也需要占用很多CPU资源

在软件Software中

如果可能

话

可以考虑用背景色来替代图片--当然这只是从技术人员

角度出发看这个问题

20. 使用ActiveX DLL

而不是ActiveXControl控件
如果你设计

ActiveX对象不涉及到用户界面

使用ActiveX DLL
编译优化
我所见过

很多VB

员从来没有使用过编译选项

也没有试图搞清楚各个选项的间

差别

下面让我们来看

下各个选项

具体含义

1. P-代码(伪代码)和本机代码
你可以选择将软件Software编译为P-代码或是本机代码

缺省选项是本机代码

那什么是P-代码和本机代码呢?
P-代码:当在VB中执行代码时

VB首先是将代码编译为P-代码

然后再解释执行编译好

P-代码

在编译环境下

使用这种代码要比本机代码快

选择P-代码后

编译时VB将伪代码放入

个EXE文件中

本机代码:本机代码是VB6以后才推出

选项

当编译为EXE文件后

本机代码

执行速度比P-代码快

选择本机代码后

编译时VB使用机器指令生成EXE文件

在使用本机代码进行编译时

我发现有时候会引入

些莫名其妙



在编译环境中我

代码完全正确地被执行了

但是用本机代码选项生成

EXE文件却不能正确执行

通常这种情况是在卸载窗口或弹出打印窗口时发生


我通过在代码中加入DoEvent语句解决了这个问题

当然出现这种情况

几率非常少

也许有些VB

员从来没有遇到过

但是它

确存在

在本机代码中还有几个选项:
a) 代码速度优化:该选项可以编译出速度较快

执行文件

但执行文件比较大

推荐使用
b) 代码大小优化:该选项可以编译出比较小

执行文件

但是以牺牲速度为代价


不推荐使用

c) 无优化:该选项只是将P-代码转化为本机代码

没有做任何优化

在调试代码时可以使用

d) 针对Pentium Pro优化:虽然该项不是本机代码中

缺省选项

但是我通常会使用该选项

该选项编译出

可执行

在Pentium Pro和Pentium 2以上

机器上可以运行得更快

而在比较老

机器上要稍稍慢

些

考虑到现在用Pentium 2都是落伍

所以推荐大家使用该选项

e) 产生符号化调试信息:该项在编译过程中生成

些调试信息

使用户可以利用Visual C


类

工具来调试编译好

代码

使用该选项会生成

个.pdf文件

该文件记录了可执行文件中

标志信息

当

拥有API

或DLL

时

该选项还是比较有帮助


2. 高级优化
高级优化中

设置可以帮助你提高软件Software

速度

但是有时候也会引入

些


因此我建议大家尽量小心地使用它们

如果在代码中有比较大

循环体或者复杂

数学运算时

选中高级优化中

某些项会大幅度提升代码

性能

如果你使用了高级优化功能

我建议你严格测试编译好

文件

a) 假定无别名:可以提高循环体中代码

执行效率

但是在如果通过变量

引用改变变量值

情况下

例如


个思路方法

变量

引用作为思路方法

参数

在思路方法中改变了变量

值

话

就会引发


有可能只是返回

结果


也有可能是导致

中断运行

严重


b) 取消

绑定检查、取消整数溢出检查和取消浮点

检查:在

运行时

如果通过这些检查发现了



处理代码会处理这些


但是如果取消了这些检查

发生了


就无法处理

只有当你确定你

代码中不会出现上面

这些

时

你才可以使用这些选项

它们将使软件Software

性能得到很大

提升

c) 允许不舍入

浮点操作:选择该选项可以是编译出来


更快地处理浮点操作

它唯


缺点就是在比较两个浮点数时可能会导致不正确

结果

d) 取消Pentium FDIV安全检查:该选项是针对

些老

Pentium芯片设置


现在看来已经过时了