1.使用整数(Integer)和长整数(Long)
提高代码运行速度最简单的方法莫过于使用正确的数据类型了,也许您不相信,但是正确地选择数据类型能够大幅度提升代码的性能。大多数情况下,程序员能够将 Single ,Doule 和 Currency 类型的变量替换为 Integer 或 Long 类型的变量,因为 VB 处理 Integer 和 Long 的能力远远高于处理其他几种数据类型。
大多数程序员选择使用 Single 或 Double 的原因是因为他们能够保存小数,但是小数也能够保存在 Integer 类型的变量中;例如城市中约定有三位小数,那么只需要将保存在 Integer 变量中的数值除以 1000 就能够得到结果。根据前人经验,使用 Integer 和Long 替代 Single,Double 和 Currency 后,代码的运行速度能提高将近10 倍。
2. 避免使用变体
对于一个VB程式员来说,这是再明显不过的事情了。变体类型的变量需要 16 个字节的空间来保存数据,而一个整数(Integer)只需要 2 个字节,通常使用变体类型的目的是为了减少设计的工作量和代码量,也有得程式员图个省事儿使用他。但是假如一个软件通过了严格设计和按照规范编码的话,能够避免使用变体类型
这里顺便提一下,对于 Object 对象也存在同样的问题。请看如下:
Dim fso
set fso=New Scripting.FileSystemObject
或
dim fso as object
set fso=NewScripting.FileSystemObject
上面代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和 CPU 时间。正确的代码应该像下面这样:
dim fso as NewFileSystemObject
3. 尽量避免使用属性
在平时的代码中,最常见的比较低效的代码就是在能够使用便利的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的 20 倍左右。下面这段代码是很多程式员在程式中会使用到的:
Dim intCon as Integer
For intCon =0 to Ubound (SomVar())
Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
Next intCon
下面这段代码的执行速度是上面的 20 倍
Dim intCon as Integer
Dim sOutput as String
For intCon =0 to Ubound(SomeVar())
sOutput=sOutput&vbCrlf&SomeVar(intCon)
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="LearnVB"
.Alignment=0
.Tag="Itsmylife"
.BackColor=vbBlack
.ForeColor=vbWhite
EndWith
或
注释:使用另外一个对象保存子对象
Dim txtTextBox as TextBox
Set txtTextBox=frmMain.Text1
txtTextBox.Text="LearnVB"
txtTextBox.Alignment=0
txtTextBox.Tag="Itsmylife"
txtTextBox.BackColor=vbBlack
txtTextBox.ForeColor=vbWhite
注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:
With Text1
.Text="LearnVB"
.Alignment=0
.Tag="Itsmylife"
.BackColor=vbBlack
.ForeColor=vbWhite
EndWith
很不幸的是,我们常常能够在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分支,会增加了额外的处理工作。
8.检查字符串是否为空
大多数程式员在检查字符串是否为空时会使用下面的方法:
If Text.Text="" then
注释:执行操作
End If
很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此个人建议大家使用以下方法:
If Len(Text1.Text)=0 then
注释:执行方法
End If
9.去除 Next 关键字后的变量名
在 Next 关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是个经验而已。但是我想很少有程式员会这样画蛇添足,毕竟大多数程式员都是惜字如金的人。
注释:错误的代码
for icount=1 to 10
注释:执行操作
Next iCount
注释:正确的代码
For iCount=1 to 10
注释:执行操作
Next
10.使用数组,而不是多个变量
当您有多个保存类似数据的变量时,能够考虑将他们用一个数组代替。在 VB 中,数组是最高效的数据结构之一。
11.使用动态数组,而不是静态数组
使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下能够节约大量的资源。
12.销毁对象
无论编写的是什么软件,程式员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程式员对这一点似乎并不是很在意。正确的做法是在退出程式前需要销毁程式中使用的对象。例如:
Dim fso as New FileSystemObject
注释:执行操作
注释:销毁对象
set fso=Nothing
对于窗体,能够进行卸载:
Unload frmMain
Set frmMain=Nothing
13. 变长和定长字符串
从技术上来说,和变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下,您都需要调用Trim 函数以去除字符串中空字符,这样反而会降低代码效率。所以除非是字符串的长度不会变化,否则还是使用变长字符串。
14.使用类模块,而不是 ActiveX 控件
除非 ActiveX 控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。
15.使用内部对象
在涉及到使用 ActiveX 控件和 DLL 的时候,很多程式员喜欢将他们编译好,然后在加入工程中。我建议您最好不要这样做,因为从 VB 连接到一个外部对象需要耗费大量的 CPU 处理能力。每当您调用方法或存取属性的时候,都会浪费大量的系统资源。假如 您有 ActiveX 控件或 DLL 的源代码,将他们作为工程的私有对象。
16.减少模块的数量
有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。假如您不是需要模块,尽量不要使用他。这样做的原因是因为只有在模块中的函数或变量被调用时,VB 才将模块加载到内存中;当 VB 应用程式退出时,才会从内存中卸载这些模块。假如代码中只有一个模块, VB 就会就只会进行一次加载操作,这样代码的效率就得到了提高;反之假如代码中有多个模块, VB 会进行多次加载操作,代码的效率会降低。
17.使用对象数组
当设计用户界面时,对于同样类型的控件,程式员应该尽量使用对象数组。您能够做一个实验:在窗口上添加 100 个 PictureBox,每个 PictureBox 都有不同的名称,运行程式,然后创建一个新的工程,同样在窗口上添加 100 个 PictureBox,但是这一次使用对象数组,运行程式,您能够注意到两个程式加载时间上的差异。
18. 使用 Move 方法
在改变对象的位置时,有些程式员喜欢使用 With,Height,Top 和 Left 属性。例如:
Image1.Width=100
Image1.Height=100
Image1.Top=0
Image1.Left=0
实际上这样做效率很低,因为程式吸怪了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用 Move 方法:
Image1.Move 0,0,100,100
19.减少图片的使用
图片将占用大量内存,而且处理图片也需要占用很多 CPU 资源。在软件中,假如可能的话,能够考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。
20. 使用 ActiveXDLL,而不是 ActiveX控件