您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 如何提高VBA代码的运行速度
如何提高代码的运行速度(VB/accessVba)本文描述了如何通过一些技术手段来提高编程代码的执行效率。这些手段可以分为两个大的部分:编码技术和编译优化技术。本文从编码技术和编译技术来讨论。大家发现有好的代码,也请回贴或更新。第一部分:编码技术。下面的这些方法(到现在为止共27种)可以帮助你提高代码的运行速度:1.使用整数(Integer)和长整数(Long)提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将Single,Double和Currency类型的变量替换为Integer或Long类型的变量,因为VB处理Integer和Long的能力远远高于处理其它几种数据类型。下面是排序:Long最快Integer.Byte.Single.Double.Currency最慢在大多数情况下,程序员选择使用Single或Double的原因是因为它们能够保存小数。但是小数也可以保存在Integer类型的变量中。例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。根据我的经验,使用Integer和Long替代Single,Double和Currency后,代码的运行速度可以提高将近10倍。2.避免使用变体对于一个VB程序员来说,这是再明显不过的事情了。变体类型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。在这里顺带提一句,对于Object对象也存在同样的问题。请看下面的代码:DimFSOSetFSO=NewScripting.FileSystemObject或DimFSOasobjectSetFSO=NewScripting.FileSystemObject上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和CPU时间。正确的代码应该象下面这样:DimFSOasNewFileSystemObject3.尽量避免使用属性在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:DimintConasIntegerForintCon=0toUbound(SomVar())Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)NextintCon下面这段代码的执行速度是上面代码的20倍。DimintConasIntegerDimsOutputasStringForintCon=0toUbound(SomeVar())sOutput=sOutput&vbCrlf&SomeVar(intCon)NextText1.Text=sOutput同样地,像这样的代码...DoUntilEOF(F)LineInput#F,nextLineText1.Text=Text1.Text+nextLineLoop...比下面的代码慢得多:DoUntilEOF(F)LineInput#F,nextLinebufferVar=bufferVar+nextLineLoopText1.Text=bufferVar然而,下面的代码完成了相同的功能,而且还要快:Text1.Text=Input(F,LOF(F))如上述,几种方法都实现了同样的任务;同时,最好的算法也是最优的。4.尽量使用数组,避免使用集合除非你必须使用集合(Collection),否则你应该尽量使用数组。据测试,数组的存取速度可以达到集合的100倍。这个数字听起来有点骇人听闻,但是如果你考虑到集合是一个对象,你就会明白为什么差异会这么大。5.展开小的循环体在编码的时候,有可能遇到这种情况:一个循环体只会循环2到3次,而且循环体由几行代码组成。在这种情况下,你可以把循环展开。原因是循环会占用额外的CPU时间。但是如果循环比较复杂,你就没有必要这样做了。6.避免使用很短的函数和使用小的循环体相同,调用只有几行代码的函数也是不经济的--调用函数所花费的时间或许比执行函数中的代码需要更长的时间。在这种情况下,你可以把函数中的代码拷贝到原来调用函数的地方。7.减少对子对象的引用在VB中,通过使用.来实现对象的引用。例如:Form1.Text1.Text在上面的例子中,程序引用了两个对象:Form1和Text1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。程序员唯一可以做就是使用With或者将用另一个对象保存子对象(Text1)。'使用WithWithfrmMain.Text1.Text=LearnVB.Alignment=0.Tag=Itsmylife.BackColor=vbBlack.ForeColor=vbWhiteEndWith或者'使用另一个对象保存子对象DimtxtTextBoxasTextBoxSettxtTextBox=frmMain.Text1TxtTextBox.Text=LearnVBTxtTextBox.Alignment=0TxtTextBox.Tag=ItsmylifeTxtTextBox.BackColor=vbBlackTxtTextBox.ForeColor=vbWhite注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:WithText1.Text=LearnVB.Alignment=0.Tag=Itsmylife.BackColor=vbBlack.ForeColor=vbWhiteEndWith很不幸的是,我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分枝,会增加了额外的处理工作。8.检查字符串是否为空大多数程序员在检查字符串是否为空时会使用下面的方法:IfText1.Text=then'执行操作Endif很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:IfLen(Text1.Text)=0then'执行操作Endif9.去除Next关键字后的变量名在Next关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是一个经验而已。不过我想很少有程序员会这样画蛇添足,毕竟大多数程序员都是惜字如金的人。'错误的代码ForiCount=1to10'执行操作NextiCount'正确的代码ForiCount=1to10'执行操作Next10.使用数组,而不是多个变量当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在VB中,数组是最高效的数据结构之一。11.使用动态数组,而不是静态数组使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。12.销毁对象无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:DimFSOasNewFileSystemObject'执行操作'销毁对象SetFSO=Nothing对于窗体,可以进行卸载:UnloadfrmMain或SetfrmMain=Nothing13.变长和定长字符串从技术上来说,与变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下,你都需要调用Trim函数以去除字符串末的空字符,这样反而会降低代码效率。所以除非是字符串的长度不会变化,否则还是使用变长字符串。14.使用类模块,而不是ActiveX控件除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。15.使用内部对象在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,然后再加入工程中。我建议你最好不要这样做,因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用方法或存取属性的时候,都会浪费大量的系统资源。如果你有ActiveX控件或DLL的源代码,将它们作为工程的私有对象。16.减少模块的数量有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。如果你不是非常需要模块,尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量被调用时,VB才将模块加载到内存中;当VB应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,VB就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,VB会进行多次加载操作,代码的效率会降低。17.使用对象数组当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个PictureBox,每个PictureBox都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个PictureBox,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。18.使用Move方法在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性。例如:Image1.Width=100Image1.Height=100Image1.Top=0Image1.Left=0实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法:Image1.Move0,0,100,10019.减少图片的使用图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。20.使用ActiveXDLL,而不是ActiveX控件如果你设计的ActiveX对象不涉及到用户界面,使用ActiveXDLL。21.使用类可以提高软件的整体性能VB提供的机制不完全支持面向对象的设计和编码,但是VB提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能。22.尽可能使用常数使用常数可以加快应用程序的运行,增强代码的可读性,而且易于维护。如果代码中的字符串或数字是不变的,则可把它们声明为常数。常数在编译时只处理一次,将适当的值写进代码;而变量在每次运行应用程序时都要读取当前值。尽量使用对象浏览器中列举的内部常数,而不要自己去创建。不要担心应用程序中引用的模块包含多余的常数;多余的常数在形成.exe文件时被删除。23.用ByVal传递参数,而不用ByRef编写含参数的Sub或Function过程时,按值(ByVal)传递参数比按地址(ByRef)快。尽管VisualBasic中参数传递的缺省方式是按地址的(ByRef),但实际上需要改变参数值的过程极少。如果过程中不需改变参数的值,就可以按值(ByVal)来传递,举例说明如下:PrivateSubDoSomething(ByValstrNameAsString,_ByValintAgeAsInteger)24.使用类型确定的可选参数使用VisualBasic5.0中类型确定的可选参数,可以提高Sub或Function的调用速度。VisualBasic以前版本中的可选参数只能是Variant的。如果过程是按值传递参数的,正如下面的例子,16个字节的Variant变量保存在堆栈中。PrivateSubDoSomething(ByValstrNameAsString,_OptionalByValvntA
本文标题:如何提高VBA代码的运行速度
链接地址:https://www.777doc.com/doc-3084831 .html