有许多字符串操作技巧可以帮助你优化代码,以获得更好的性能。StringBuilder允许你执行重复的字符串操作,取得比手工操作更佳的性能。在本文中,我说明在VB.NET中利用StringBuilder的情况。应用StringBuilder的优点StringBuilder是一个可修改字符的缓冲器。当你不直接进行字符串操作而应用StringBuilder时,与每次重复生成一个含有修正的新字符串相比,这样可以获得更佳的性能。你不能总是希望性能得到提高,因为StringBuilder有少量的过度操作,会将指定字符串的内容复制到StringBuilder中,然后将由StringBuilder得到的结果值复制回字符串对象中。在进行二个或更多字符串操作时,我建议使用StringBuilder。(如果只有一项改变,将值复制进StringBuilder再拷贝出来并不会改善性能。)StringBuilder方法Append:允许你在缓冲器末端增加一个字符串。注意,在应用StringBuilder对象时不能使用操作符。
创新互联建站是专业的玉泉街道网站建设公司,玉泉街道接单;提供网站设计制作、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行玉泉街道网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Insert:允许你在StringBuilder对象中增加一个字符串。(就像String.Insert一样。)
Remove:允许你从StringBuilder对象中删除一个字符串。(就像String.Remove一样。)
Replace:允许你替代StringBuilder对象的一部分。(就像String.Replace一样。)
实例在列表A的样本代码中,我建立一个字符串变量strOriginal来保存原始文本的值。我还定义StringBuilder对象BuilderStr,我将利用它对存储在srtOriginal中的文本进行字符串操作。定义BuilderStr时,我将它设定到strOriginal的值中。之后,我操作BuilderStr,给它添加一些文本(“is”,
”very”,”
important”),然后再利用Replace方法去掉”very”这个单词。(注意,在这个例子中,你使用Remove方法而非Replace方法。)最后,我用BuilderStr.ToString的值更新strOriginal,并在信息框中显示所得到的字符串。
1.开始--运行--regedit 打开注册表
2.在注册表里面搜索vb ,删除所有关于vb的东东.
3.重新启动计算机
之后再试一试
.NET语言,包括VB.NET,它们所开发的程序源代码并不是直接编译成能够直接在操作系统上执行的二进制本地代码,而是被编译成为中间代码,然后通过.NET Framework的通用语言运行时(CLR)——执行。 所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码,这与Java的字节码类似。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度会明显加快。
VB.NET代码之所以不直接编译成二进制机器码,是基于.NET跨平台这一目标的考虑。 Visual Basic .NET 2002
2002年Visual Basic .NET 问世,此后Visual Basic 包含在 Visual Studio套装中。该版本又被称为VB 7.0,是与C#一起在2002年发布的最初始的VB.net版本。C#是一门新设计.Net语言并且语法上和Java有一定的相似性,所以被大力宣传为微软对付JAVA的王牌,受到媒体极力关注。然而VB.NET则相反被错误地认为仅仅是VB的一个升级(故有时被称为VB7),它的受关注度也因此较低,当然VB社区以及喜欢Basic系列风格的语言的人还是很关注它的。那些试用过此版VB.NET的人在层层幕布下发现一个强大却艰深的语言。不过任何一种语言都是有弱点的,当然后面这一点也是.NET语言的共性,那就是运行的计算机上必须装相应版本的.Net framework。
Visual Basic .NET 2003
该版本是和.NET Framework 1.1一起发布的。新功能包括对.NET Compact Framework的支持和更好的VB升迁向导。并改进了运行状况,IDE稳定性(尤其是后台编译器),以及运行时RunTime稳定性。另外,VB.NET2003还有一个学院版Visual Studio .NET 2003 Academic Edition (VS03AE),它是分发给各国某些学者免费使用的版本。
Visual Basic .NET 2005
该版本是VB.Net的重大转变。但是这个版本的 Visual Studio 仍然还是面向 .NET 框架的(版本2.0)。它同时也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一个非常庞大的软件,甚至包含代码测试功能。
Visual Basic .NET 2008
Visual Basic 2008于2008年2月1日发布。通过几年的发展,它已成为一种专业化的开发语言和环境。用户可用 Visual Basic 快速创建 Windows 程序,现在还可以编写企业水平的客户/服务器程序及强大的数据库应用程序。
Visual Studio 2010
Visual Studio 2010于2010年4月12日上市,其中包含 Visual Basic .NET 2010 。Visual Studio是微软公司推出的开发环境。是目前最流行的Windows平台应用程序开发环境。Visual Studio 2010集成开发环境(IDE)的界面被重新设计和组织,变得更加简单明了。Visual Studio 2010同时带来了 NET Framework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持开发面向Windows 7的应用程序。除了Microsoft SQL Server,它还支持 IBM DB2和Oracle数据库等。
Visual Studio 2012
从该版本开始VB.NET已没有单独发售的IDE了,微软给Visual Basic .NET 以及C#开发者的IDE就只有Visual Studio 了。该版本增加了modern(原metro)风格的支持等众多新特性。
Visual Studio 2015
增加了大量新特性,提升你的编写效率。对编译器和开发环境优化,提高编译速度,帮你重构代码和解决错误。最明显的14项改进见参考资料的14 Top Improvements in Visual Basic 14。 不能简单认为VB .net是VB的新版本。首先它们一个是完全面向对象的语言,而另一个不是完全面向对象的,其次VB .NET是构建于.Net framework之上的。当然,它们同属Basic系列语言,又同为微软所开发,语法上有一定的相似或沿袭是很正常的,但不能因此认为VB .NET是VB的升级版。
对于想从VB转到VB .NET的开发者来说,如果你只是喜欢Basic系列语言的代码风格,那么你的迁移会很顺利,如果你想沿袭之前VB的编程思想和习惯,你会很苦恼,原因之一就是VB .NET贯穿的是完全面向对象的思想,而VB不是。
微软为使VB开发者更容易转到VB .NET,兼容一些VB6函数和库的用法,但是比不上.NET语言中自带的可替换的函数和库来得高效,所以我们应该尽量使用.NET下的新方法。微软还提供了VB到VB .NET的自动转换器,虽几经改进,但仍无法转换全部代码,几乎所有非小型程序都需要人工修改以完成编译。为了运行优化,大多程序需要大量工作去重构。
争议与解释:许多资深的VB程序员抱怨VB .NET,因为VB .NET丢掉了许多不再发行的VB6中使用的大量语言constructs和用户界面功能,并且对保留下来的东西也改变了语意。其实不应该再把VB和VB .NET做功能上的比较,因为它们除了有些语法相似外,可以说是完全不同的两种语言。
Visual Basic .NET与VB都代表了Basic系列语言的编码风格,Visual Basic .NET是这种编码风格在.NET平台上的继承,而不是同系列语言VB的沿袭。
语言革命
* 1991年4月,Visual Basic诞生,Visual Basic 1.0 Windows版本发布。这个连接编程语言和用户界面的进步被称为Tripod(有些时候叫做Ruby),最初的设计是由阿兰·库珀(Alan Cooper)完成的。 1992年9月,Visual Basic 1.0 DOS版本发布。
* 1998年夏天,VB6.0发布。
* 2001年,Visual Basic .NET和.NET Framework发布。Visual Basic .NET正式诞生。
* 2005年,微软宣布将不会再对非.NET版本的VB进行支持。
*2010年,Visual Basic .NET随Visual Studio 2010发布,不再提供单独的Visual Basic .NET IDE。 MONO开发平台提供了一个VB.NET特性库(VB.NET-specific libraries)并着手研发一个编译器和Windows Forms GUI 库。由于各方面的原因,VB.NET开发的开源工具较C#发展得慢一些。
vb.net编程工具是:Microsoft Visual Studio 2008
1、Microsoft Visual Studio 2008是面向Windows Vista、Office 2007、Web 2.0的下一代开发工具,代号“Orcas”,是对Visual Studio 2005一次及时、全面的升级。
2、VS2008引入了250多个新特性,整合了对象、关系型数据、XML访问方式,语言更简洁。
3、使用Visual Studio 2008可以高效开发Windows应用。
4、设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。
5、Visual Studio 2008支持项目模板、调试器和部署程序。
6、Visual Studio 2008可以高效开发Web应用,集成了AJAX 1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
:
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对象也存在同样的问题。请看下面的代码:
Dim FSO
Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object
Set FSO = New Scripting.FileSystemObject
上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和CPU时间。正确的代码应该象下面这样:
Dim FSO as New FileSystemObject
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
同样地,像这样的代码 . . .
Do Until EOF(F)
Line Input #F, nextLine
Text1.Text = Text1.Text + nextLine
Loop
. . . 比下面的代码慢得多:
Do Until EOF(F)
Line Input #F, nextLine
bufferVar = bufferVar + nextLine
Loop
Text1.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)。
' 使用With
With frmMain.Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.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 life"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite
注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:
With Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸的是,我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分枝,会增加了额外的处理工作。
8. 检查字符串是否为空
大多数程序员在检查字符串是否为空时会使用下面的方法:
If Text1.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方法
在改变对象的位置时,有些程序员喜欢使用Width,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. 使用ActiveX DLL,而不是ActiveX控件
如果你设计的ActiveX对象不涉及到用户界面,使用ActiveX DLL。
21. 使用类可以提高软件的整体性能
VB提供的机制不完全支持面向对象的设计和编码,但是VB提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能。
22. 尽可能使用常数
使用常数可以加快应用程序的运行,增强代码的可读性,而且易于维护。如果代码中的字符串或数字是不变的,则可把它们声明为常数。常数在编译时只处理一次,将适当的值写进代码;而变量在每次运行应用程序时都要读取当前值。
尽量使用对象浏览器中列举的内部常数,而不要自己去创建。不要担心应用程序中引用的模块包含多余的常数;多余的常数在形成 .exe 文件时被删除。
23. 用 ByVal 传递参数,而不用 ByRef
编写含参数的 Sub 或 Function 过程时,按值 (ByVal) 传递参数比按地址 (ByRef) 快。尽管 Visual Basic 中参数传递的缺省方式是按地址的 (ByRef) ,但实际上需要改变参数值的过程极少。如果过程中不需改变参数的值,就可以按值 (ByVal) 来传递,举例说明如下:
Private Sub DoSomething(ByVal strName As String, _
ByVal intAge As Integer)
24. 使用类型确定的可选参数
使用 Visual Basic 5.0 中类型确定的可选参数,可以提高 Sub 或 Function 的调用速度。Visual Basic 以前版本中的可选参数只能是 Variant 的。如果过程是按值传递参数的,正如下面的例子,16 个字节的 Variant 变量保存在堆栈中。
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal vntAge As Variant, _
Optional ByVal vntWeight As Variant)
使用类型确定的可选参数,每次调用时占用的堆栈空间较少,而且传递到内存中的数据也较少:
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal intAge As Integer, _
Optional ByVal intWeight As Integer)
类型确定的可选参数的访问速度比 Variant 快,而且一旦数据类型错误,编译时就显示错误信息。
25利用集合的优点
可以定义和使用对象的集合是 Visual Basic 的强大功能之一。尽管集合是非常有用的,但还要正确使用才能获得最好的效果:
使用 For Each...Next 替代 For...Next。
26. 添加集合的对象时避免使用 Before 和 After 参数。
使用键集而不用几组相同对象的数组。
集合可以用 For...Next 循环进行迭代。但采用 For Each...Next 可读性更好,而且多数情况下更快。For Each...Next 是由集合的生成器实现迭代的,所以实际的操作速度将随集合对象的不同而改变。由于 For Each...Next 的最简单的实现机理就是 For...Next 的线性迭代,因此 For Each...Next 不会比 For...Next 慢。但是,有些情况下采用了比线性迭代更复杂的实现机理,所以 For Each...Next 要快得多。
如果没有使用 Before 和 After 参数,则往集合中添加对象是非常快的。否则,Visual Basic 必须在集合中检测到其它对象后,才能添加新对象。
如果对象的类型都一样,集合或数组都可以用来管理这些对象(如果对象的类型不一样,则只能用集合)。从速度的观点看,选择何种方式取决于对象的访问方式。如果能够为每一对象分配唯一的键,则集合是访问对象的最快方式。使用键从集合中检索对象比从数组中顺序遍历对象快。当然,如果没有键而要遍历对象时,则选择数组比较好。就顺序遍历方式而言,数组比集合快。
如果对象的个数少,则数组使用的内存小,并且搜索的速度快。当对象的个数在 100 左右时,集合比数组的效率高;当然,具体的数目还有赖于微处理器的速度和可用的内存。
26. 不要用Do While Not record.EOF 语句。
例如下面的代码比较慢:
Do While Not record.EOF
'代码
record.MoveNext
Loop
下面的要快好多
Record.MoveLast
intCount=Record.RecordCount
Record.MoveFirst
For i=1 To intCount
'代码
Records.MoveNext
Next i
第二部分 编译优化
我所见过的很多VB程序员从来没有使用过编译选项,也没有试图搞清楚各个选项之间的差别。下面让我们来看一下各个选项的具体含义。
1. P-代码(伪代码)和本机代码
你可以选择将软件编译为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. 高级优化
高级优化中的设置可以帮助你提高软件的速度,但是有时候也会引入一些错误,因此我建议大家尽量小心地使用它们。如果在代码中有比较大的循环体或者复杂的数学运算时,选中高级优化中的某些项会大幅度提升代码的性能。如果你使用了高级优化功能,我建议你严格测试编译好的文件。
a) 假定无别名:可以提高循环体中代码的执行效率,但是在如果通过变量的引用改变变量值的情况下,例如调用一个方法,变量的引用作为方法的参数,在方法中改变了变量的值的话,就会引发错误。有可能只是返回的结果错误,也有可能是导致程序中断运行的严重错误。
b) 取消数组绑定检查、取消整数溢出检查和取消浮点错误检查:在程序运行时,如果通过这些检查发现了错误,错误处理代码会处理这些错误。但是如果取消了这些检查,发生了错误程序就无法处理。只有当你确定你的代码中不会出现上面的这些错误时,你才可以使用这些选项。它们将使软件的性能得到很大的提升。
c) 允许不舍入的浮点操作:选择该选项可以是编译出来的程序更快地处理浮点操作。它唯一的缺点就是在比较两个浮点数时可能会导致不正确的结果。
d) 取消Pentium FDIV安全检查:该选项是针对一些老的Pentium芯片设置的,现在看来已经过时了。
没有额不过有文字式的教程在优化程序代码大小的诸多技术中,大多包括从代码中删除不必要的元素。在编译应用程序时,Visual Basic自动删除某些元素。而标识符名称、注释、空行的长度或数量是无须限制的,当应用程序作为一个.EXE文件运行时,以上这些元素都不会影响应用程序所占内存的大小。其他元素,如变量、窗体和过程,确实要占据内存的一部分空间。最好将它们精简以使效率更高。下面介绍6种方法可用于缩小应用程序所需内存和减少代码大小,希望能对初学者有所帮助。1、减少加载窗体、控件数目和用标签代替文本框
每一个加载的窗体,无论可视与否,都要占据一定数量的内存(其数量随窗体上控件的类型和数量,以及窗体上位图的大小等的不同而变化)。只在需要显示时才加载窗体,不再需要时卸载窗体(而不是隐藏窗体)。记住,任何对窗体的属性、方法或控件的引用,或对用New声明的窗体变量的引用,都会导致Visual Basic加载该窗体。
使用Unload方法卸载窗体时,只能释放部分窗体所占空间。要释放所有空间,可用关键字Nothing使窗体的引用无效:
Set Form=Nothing g:dH ~
当设计应用程序时,窗体应尽量少用控件。实际的限制取决于控件的类型和系统,但实际上,含有大量控件的窗体将运行缓慢。一项与之相关的技术是:设计时尽可能地使用控件数组,而不是在窗体上放置大量同类型的控件。控件数组是一组具有共同名称和类型的控件。它们的事件过程也相同。在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同类型的控件消耗的资源要少。当希望若干控件共享代码时,控件数组也很有用。标签控件Label占用的Windows资源比文本框Textbox少,因此在可能的情况下,应使用标签代替文本框。例如,当窗体上需要一个隐藏的控件保存文本时,使用标签更有效。
2、使用磁盘文件或资源和组织模块
在设计时,直接放入应用程序的数据(象属性或代码中的文字字符串和数值)将增加运行时应用程序占用的内存。运行时从磁盘文件或资源中加载数据可减少占用内存。这对大位图和字符串特别有价值。资源文件实际上是由一系列独立的字符串、位图或者其他项目组成的,其中每一项都有一个唯一的标识符。可以使用类似于在Microsoft Visual C++中提供的文本编辑器和资源编译器创建资源文件。编译过的资源文件带有.res扩展名。 Visual Basic只在需要时才加载模块即当代码调用模块中的一个过程时,模块才被加载到内存。如果从未调用一特定模块中的过程,Visual Basic决不加载该模块。因此,尽量把相关的过程放在同一模块中,让Visual Basic只在需要时才加载模块。
3、考虑替换Variant数据类型 Variant数据类型使用极其灵活,但是比其他数据类型所占内存大。当要压缩应用程序多余的空间时,应考虑用其他数据类型替代Variant变量,特别是替代Variant变量数组。每一个Variant占用16个字节,而Integer占2个字节,Double占8个字节。变长字符串变量占用4个字节加上字符串中每一个字符占用1个字节,但是,每一个包含字符串的Variant都要占用16个字节加上字符串中每一个字符占用1个字节。因为它们太大,因此在用作局部变量或过程的参数时,Variant变量是特别烦人的,这是因为它们消耗堆栈空间太快。但在有些情况下,使用其他数据类型替代Variant,灵活性降低了,为弥补损失的灵活性,不得不增加更多的代码。结果是大小没有真正的减小。
4、使用动态数组并在删除时回收内存
使用动态数组代替固定数组。当不再需要动态数组的数据时,用Erase或ReDim Preserve放弃不需要的数据,并回收数组所用内存。例如,用以下代码可回收动态数组所用空间: +W\f(/q0
qImjB{3`
Erase MyArray CS-uNG6
里,Erase完全删除数组,ReDim Preserve则只缩短数组而不丢失其内容:
ReDim Preserve MyArray(10, smallernum)
删除了固定大小数组,也不能回收该数组所占空间--只是简单地清除数组每一元素中的值。如果元素是字符串,或包含字符串或数组的Variant变量,那么删除数组可回收这些字符串或Variants所占内存,而不是数组本身所占内存。
5、回收被字符串或对象变量用过的空间
当过程结束时,可自动回收(非静态)局部字符串和数组变量所用空间。但是,全局和模块级的字符串和数组变量一直存活到整个程序结束。要想应用程序尽量小,就得尽可能回收这些变量所用空间。将零长度字符串赋给字符串变量,可回收其空间: !
SomeString Var="" '回收空间 同样,将对象变量设置成Nothing可回收该对象所用的部分(而不是全部)空间。例如,删除一个Form对象变量:
Global F As New StatusForm
F.Show 1 'Form加载并以模态显示
X=F.Text1.Text '用户按下按钮,隐藏窗体
Unload F '删除窗体可视部分 Set F=Nothing '回收空间(模块数据)
即使没有使用显式窗体变量,也应注意将不再用的窗体卸载,而不是简单地隐藏。
6、消除死代码和无用的变量
在开发和修改应用程序时,可能遗留了死代码--代码中的一个完整过程,而它并没有被任何地方调用。也可能声明了一些不用的变量。虽然在创建.exe文件中,Visual Basic确实可删除无用的常数,但不能删除无用的变量和死代码。注意要复查代码,查找并删除无用的变量和死代码。如Debug.Print语句,在运行.exe时被忽略,可它常常出现在.exe文件中。
当创建.exe文件时,含有字符串和变量作为参数的Debug.Print语句不会被编译。但对于含有函数作为参数的Debug.Print语句,其本身被编译器忽略,而函数则被编译。因此,在应用程序运行时,函数被调用,但返回值被忽略。因为在.exe文件中,函数作为Debug.Print的参数出现时,将占用空间和CPU周期时间,所以在生成exe文件前,最好删除这些语句。
在"编辑"菜单中使用"查找"命令搜索特定变量的引用。或者当每个模块都含有Option Explicit语句时,通过删除或注释该变量的声明,并运行应用程序,可迅速发现变量是否被使用。若该变量被使用,则Visual Basic将出错。若不出错,则该变量没被使用。