当前位置:

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

什么是一个高效的软件

高效软件需在同等功能下运行更快且占用更少系统资源。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芯片设计的,现在已经没啥用了。
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)
    VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)

    VB6 里有几个特别容易让人迷糊的“特殊值”——Null、Missing、Empty、Nothing、vbNullString。除了最后一个,其他几个都不能直接用 a = 值 这种方式来判断。下面咱们逐个拆解,理清楚它们到底是怎么回事。 1、Null Null 代表“空值”,本质上是一个不合法的数据

    Windows 10 x64 安装 Visual Basic 6.0 SP6注意事项
    Windows 10 x64 安装 Visual Basic 6.0 SP6注意事项

    在Windows 10 x64上安装Visual Basic 6.0 SP6,绝对是个让人头疼的活儿。折腾了两天才搞定,把遇到的坑和解决方法整理出来,希望能帮到正在挣扎的朋友。 先说几个前置条件:Windows 7 x64和Windows 8 x64理论上都能装,不过下面这些经验主要基于Win10

    VB中使用WMI获取系统硬件和软件有关信息
    VB中使用WMI获取系统硬件和软件有关信息

    WMI是Windows管理接口,支持本地及远程获取软硬件信息。VB中需引用MicrosoftWMIScriptingV1.1库,通过Win32_类如SoundDevice、VideoController等查询声卡、显卡、内存及操作系统详情。该技术广泛用于系统监控与配置。

    在VB中遍历文件并用正则表达式完成复制及vb实现重命名、拷贝文件夹的方法
    在VB中遍历文件并用正则表达式完成复制及vb实现重命名、拷贝文件夹的方法

    在VB开发中,利用FSO对象和正则表达式可实现文件按规则复制,如将文件名含“1项目”或“一项目”的文件复制到目标目录;同时也可实现文件夹重命名与拷贝,代码结构清晰,可直接套用或微调。

    VB FileSystemObject对象实例详解
    VB FileSystemObject对象实例详解

    FileSystemObject是ASP开发中操作服务器文件系统的核心对象,提供Drives属性及二十多种方法,可创建、读取、修改、删除文件和文件夹,并支持驱动器、路径处理及文件对象属性与方法的调用,功能全面且易于使用。

    VB关机恶搞小程序
    VB关机恶搞小程序

    基于VB的恶搞关机小程序利用系统命令或API触发强制关机,并通过注册表或启动文件夹实现自启动。交互版添加对话框要求输入“我是猪”取消关机,同时拦截关闭事件进行自我保护。核心涉及关机触发与自启动机制。

    VB实现的《QQ美女找茬游戏》实例
    VB实现的《QQ美女找茬游戏》实例

    一个基于VB的自动找茬程序,通过API截取屏幕两幅图片,逐像素对比其RGB分量,差值超过30时标记为差异点,并在窗体上绘制结果。程序将窗口设为总在最前,点击触发分析,实现快速自动找茬。

    VB实现按行读取文本文件的方法
    VB实现按行读取文本文件的方法

    VB中使用LineInput语句与FreeFile函数逐行读取文本文件,避免一次性加载大文件造成内存溢出。每行读取后可进行拼接、解析等处理,操作完毕必须关闭文件以释放系统资源。

    VB键盘鼠标无动作调用程序的尝试
    VB键盘鼠标无动作调用程序的尝试

    实现键盘鼠标无动作时调用程序,曾尝试HOOK钩子与Windows屏保检测均失败。最终用GetLastInputInfo函数获取系统空闲时间,成功触发操作,例如空闲15分钟弹出关机提示。

    VB实现禁用任务管理器的方法
    VB实现禁用任务管理器的方法

    在WindowsXP系统中,通过二进制流占用任务管理器可执行文件即可禁用任务管理器,使其无法被用户启动;而在Vista及Windows7系统中,则需要改用任务终止命令强制结束进程,并将该命令置于定时器事件中循环执行,从而持续阻止任务管理器重新启动,最终实现对任务管理器的长期禁用。这一方法通过占用文件。

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。