suffer 发表于 2006-10-20 15:47

LabVIEW 的运行效率 1 - 找到程序运行速度的瓶颈

找到程序运行速度的瓶颈
    想要提高程序的运行效率,首先要找到程序运行的瓶颈在哪里。LabVIEW 程序的运行也符合 80/20 定理:20%的程序代码占用了80%的运行时间。如果能找到这20%的代码,加以优化,就可以达到事半功倍的效果。
    对于已经编写好的程序,可以通过内存和信息工具来查看程序中每个 VI 运行了多长时间。对程序的效率进行优化,要从最耗时的 VI 着手。
    内存和信息工具可以从 LabVIEW 的菜单项 Tools->Profile->Performance and Memory 中启动。图1 是这个工具的界面。
图1:内存和信息(Profile Performance and Memory)工具

    在内存和信息工具中会列出一个程序中的全部子 VI。在运行这个程序之前,先按下工具界面上的 Start 按钮,工具就开始为所有的子 VI 进行统计了。你的程序运行结束后,点击工具上的 Snapshot,就会显示出每个子 VI 在刚才的运行中占用了多少 CPU 时间。按照 VI Time 降序排序,排在最前面的几个 VI 就是程序的瓶颈,是需要重点优化的对象。



    一个子 VI 占用了大量 CPU 时间,有可能是因为它内部的运算较为复杂,那就需要打开它,对它的算法进行优化。但更有可能的是因为这个 VI 被程序执行的次数太多。这时,你就要考虑程序结构了,是否可以减少这个 VI 的运行次数,比如把它从某些不必要的循环中挪出去,或者拆分这个 VI 的代码,把没有必要循环执行的部分分离出去,挪到循环体外面。

    并不是所有的运行效率问题都可以在内存和信息工具中体现出来的。
    VI Time 列出的只是子 VI 的 CPU 占用时间,如果你的程序里存在大量的不必要延时,或者程序常常被某些低速工作(如读写外部仪器,通过网络传输数据等)所阻塞。这样的程序效率肯定也是很低的,但是这一类的低效率因素在内存和信息工具上是体现不出来的。
    有些非常耗用 CPU 的操作也无法体现在内存和信息工具上。比如我以后在《LabVIEW 的线程》第四章中会提到一个使用 OpenGL 的例子,由于程序线程设计不当,CPU 被大量消耗在线程切换上。从系统资源管理器看,CPU 被 LabVIEW 占满,在内存和信息工具却看不到任何一个 VI 占用了如此多的 CPU 时间。

    在多核 CPU 的计算机上,由于程序可以在多个 CPU 内核上同时执行,某些子 VI 虽然占用的大量的 CPU 时间,如果程序线程设置合理,是可以让这些 VI 不影响到程序的整体效率的。

转自http://ruanqizhen.spaces.live.com/Blog/cns!1pU-rgQVTuuWM1TX8W8PfmDA!1073.entry
版权归原作者所有

younghorse 发表于 2006-10-20 16:12

说到效率,我突然想到local variable 和property Note的区别

local variable:实质就是对“控制器”/“指示器”中数据进行复制(copy),所以要占用内存,当为数组建立多个本地变量时,会占用大量的内存。
操作行为是读数据(Read)或写数据(Write)

property Note:建立属性节点实质上是对“控制器”/“指示器”中数据进行查询或置入,不会占用内存。因为在部件创建时已经为此参数分配好了内存,多少有些像VB中的属性设置。操作行为是查询(Query)数据或置入(Set)数据。

本地变量:由于本地变量是对内存操作,所以运行速度很快。

属性节点:相对于本地变量来讲,属性节点的效率是很低的,或者说更占用CPU的资源。

此外property Note 可以根据error in 和error out还控制数据流,可防止数据竞态

lizheng 发表于 2007-6-2 15:42

刚试了一下

刚才查看了一下我的程序中的内存使用,发现效率还是比较低的。:@L
页: [1]
查看完整版本: LabVIEW 的运行效率 1 - 找到程序运行速度的瓶颈