当前位置:

首页 > 编程开发 > 什么是一个高效的软件

什么是一个高效的软件

高效软件需在同等功能下运行更快且占用更少系统资源。VB代码优化核心包括:优先使用整数或长整数替代浮点类型,避免变体与反复读取属性,用数组替代集合,展开小循环体,减少对象引用层次,善用With或对象变量,并注意及时销毁对象以释放内存。编译时推荐本机代码并选择代码速度优化。

什么才称得上是一个高效的软件?核心标准其实很简单:它在完成同样功能的前提下,不仅要跑得更快,还得吃更少的系统资源。这篇文章里,我整理了一些在VB开发过程中积累下来的实战经验,打算用一些简短的例子,给你展示一下怎么写出更高效的VB代码。其中包含了不少可能会对VB开发者有实际帮助的技术细节。在展开具体讨论之前,有几个核心理念值得先摆出来。 **让代码一次成型:** 我见过不少程序员,习惯先把功能代码“堆”出来,然后再回头琢磨怎么优化。结果往往是,为了达到优化目标,几乎得把代码推倒重写一遍。所以,我的建议是:在写代码之前,就把优化这件事儿放进你的设计蓝图里。 **把握好优化的ROI:** 通常写完一段代码后,需要检查和打磨。在这个过程中,你可能会发现某个循环里的代码效率还能再提一提。这时候,很多追求完美的程序员可能会立刻动手改。我的建议是:如果修改这段代码能让程序运行快个一秒,那值得做;但如果只能提升10毫秒,那就别动它了。原因很简单——重写代码大概率会引入新bug,而调试新代码同样需要时间。程序员需要在软件性能和开发投入之间找到一个平衡点。而且说实话,10毫秒的差异,用户是根本感受不到的。 **该用面向对象的时候,别犹豫:** VB提供的机制虽然不完全支持纯正的面向对象设计和编码,但它提供了简单的类。很多人觉得使用对象会拖慢代码效率。对于这一点,其实可以换个角度来看:衡量代码效率不能只盯着运行速度,软件占用的资源也是一个重要指标。使用类,有时候反而能在整体上提升软件的性能表现,这一点在后面会用具体例子来说明。 当你开始写VB代码时,可以把上面几点当作指导原则。我把整篇文章分成了两个部分:一部分讲如何提升代码的运行速度,另一部分聊编译优化。

如何提高代码的运行速度

下面这些方法,可以说是经过大量实践验证的“提速利器”。

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

提高代码运行速度最简单的方法,可能就藏在你选择的数据类型里。别小看这个选择,正确的数据类型能让性能提升一大截。在大多数情况下,完全可以把Single、Double和Currency类型的变量换成Integer或Long,因为VB处理后者的效率要远远高于前者。 你可能会问,用Single或Double是因为它们能保存小数。但小数也可以“存”在Integer里。比如,如果程序里约定保留三位小数,那么把数值保存在Integer变量中,需要时除以1000就行了。经验表明,用Integer和Long替换Single、Double和Currency后,代码的运行速度能提升将近10倍。

2. 避免使用变体

对于VB程序员来说,这应该是个常识了。变体类型的变量需要16个字节来保存数据,而一个整数只需要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. 尽量避免使用属性

在日常的代码里,最常见的低效行为就是:明明可以用变量,偏偏反复去读属性,尤其是在循环里。要知道,存取变量的速度可是存取属性的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. 展开小的循环体

有时候,你会遇到一个循环体只循环两三次,而且里面的代码也很少。这种情况下,完全可以把循环展开。因为循环本身会占用额外的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就只做一次加载;模块越多,加载次数越多,效率自然就低了。

17. 使用对象数组

设计用户界面时,对于相同类型的控件,尽量使用对象数组。你可以做个实验:在一个窗口上放100个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。

编译优化

我见过不少VB程序员,从来没碰过编译选项,也不清楚各个选项之间的差异。下面我们来逐一看看。

1. P-代码(伪代码)和本机代码

你可以选择把软件编译为P-代码或本机代码。缺省选项是本机代码。 **P-代码:** 在VB中执行代码时,系统会先把代码编译成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芯片设计的,现在已经没啥用了。
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。