专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »VB教程 » vb程序代码编写:如何编写高质量的VB代码-vb教程 »正文

vb程序代码编写:如何编写高质量的VB代码-vb教程

来源: 发布时间:星期四, 2009年2月12日 浏览:418次 评论:0


G>介绍:

  本文描述了如何通过些技术手段来提高VB代码执行效率这些手段可以分为两个大部分:编码技术和编译优化技术在编码技术中介绍了如何通过使用高效数据类型、减少外部引用等编程手段来提高代码执行速度减少代码消耗系统资源在编译优化技术中介绍了如何正确地利用VB提供编译选项对在编译时最后生成可执行文件进行优化

  前言

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

  让代码次成型:在我接触到员中有很多人喜欢先根据功能需求把代码写出来然后在此基础上优化代码最后发现为了达到优化他们不得不把代码再重新写所以我建议你在编写代码的前就需要考虑优化问题

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

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

  当你编写VB代码时候希望你能把上面几点作为指导你编码原则我把文章分为两个部分:如何提高代码运行速度和编译优化

  如何提高代码运行速度

  下面这些思路方法可以帮助你提高代码运行速度:

  1. 使用整数(Integer)和长整数(Long)

  提高代码运行速度最简单思路方法莫过于使用正确数据类型了也许你不相信但是正确地选择数据类型可以大幅度提升代码性能在大多数情况下员可以将SingleDouble和Currency类型变量替换为Integer或Long类型变量VB处理Integer和Long能力远远高于处理其它几种数据类型

  在大多数情况下员选择使用Single或Double原因是它们能够保存小数但是小数也可以保存在Integer类型变量中例如中约定有 3位小数那么只需要将保存在Integer变量中数值除以1000就可以得到结果根据我经验使用Integer和Long替代SingleDouble和Currency后代码运行速度可以提高将近10倍

  2. 避免使用变体

  对于个VB员来说这是再明显不过事情了变体类型变量需要16个字节空间来保存数据个整数(Integer)只需要2个字节通常使用变体类型是为了减少设计工作量和代码量也有员图个省事而使用它但是如果个软件Software经过了严格设计和按照规范标准编码完全可以避免使用变体类型

  在这里顺带提对于Object对象也存在同样问题请看下面代码:

Dim FSO
Set FSO = New Scripting.FileObject


  或

Dim FSO as object
Set FSO = New Scripting.FileObject


  上面代码由于在申明时候没有指定数据类型在赋值时将浪费内存和CPU时间正确代码应该象下面这样:

Dim FSO as New FileObject

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 le\"
.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 le\"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite


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

With Text1
.Text = \"Learn VB\"
.Alignment = 0
.Tag = \"Its my le\"
.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 FileObject
´ 执行操作
´ 销毁对象
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思路方法

  在改变对象位置时有些员喜欢使用WidthHeightTop和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芯片设置现在看来已经过时了

6

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: