当前位置:首页 > 测试测量 > 测试测量
[导读]很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象SUBVI一样可以重用数据BUFFER 不利于程序调试 容易引起竞争 我在论坛上看到很多初学

很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因:

违背了数据流的编程
读取局部变量需要拷贝数据
不能象SUBVI一样可以重用数据BUFFER
不利于程序调试
容易引起竞争
我在论坛上看到很多初学者的程序,里面充满了大量的局部变量,可以这样说,当你使用了过多的局部变量的时候,你的程序结构是有问题的,在早期的LV版本中根本不存在全局变量和局部变量,同样可以编制规模很大的程序,这说明局部变量和全局变量并不是必须的,LV提供了它们是因为在特定的情况下可以简化编程。

当我们使用SUBVI时,我们需要定义一个连接器,包括输入输出端子,调用VI的数据从输入端子进入,当SUBVI未执行完毕时,数据是不会流出到输出端子的,因此,SUBVI可以重用调用VI的数据缓冲区。而局部变量可以在子VI的任何位置被读写,局部变量在同一一个VI中,全局变量可以在任何VI中,所以通常情况下,无法重用数据缓冲区。

局部变量用于读写一个VI的前面板对象,对象是控制器或者指示器都可以,当我们读局部变量的时候,我们是在对象的当前状态,而对象在程序框图中的其它位置,其它的线程可能连续写这个对象,所以LABVIEW无法重用内存,不得不拷贝数据到新的缓冲区中,如果数据结构很大,就会占用相当多的内存。

很多情况下,局部变量都是可以避免的,看下面的例子。



上面图中的设计方式,在很多初学的程序中经常碰到,同样的数据要传到两个VI中,并且有次序要求,因此采用了顺序结构。问题是根本没有必要用局部变量,局部变量导致了数据的复制。





上面的两个图完成同样的功能,一个仍然采用顺序结构,不过CLUSTER挪到了FRAME外面,通过隧道,将数据传入到两个子VI中,避免了使用局部变量。但是顺序结构本身也是效率比较低的,也是NI不建议过度使用的.

针对这个具体问题,最下面的是最好地解决方案,利用错误簇作为数据流实现了顺序处理,避免使用局部变量。通过错误簇同时也有利于程序调试跟踪.另外一个明显的优点是程序框图更清晰明了,避免了在各个FRAME中进行切换.


全局变量使用内存的方式类似于局部变量,不同的是每次读全局变量肯定要生成一份内存拷贝,而局部变量是有可能重用缓冲区的.当全局变量是一个比较大的数组或者字符串时,多处多次读操作会造成大量的内存复制,极大地占用内存,导致运行速度下降。

从使用方法的角度看,全局变量很向一个SUBVI(8。X后SUBVI也有了使用权限的问题,如私有,公有),可以被任何其它VI调用,但是有一个根本的不同,当一个SUBVI正在被其他VI调用的时候,另外一个VI如果也在调用这个SUBVI,它必须等待这个SUBVI执行完成后,(设置可重入的除外),因此,尽管LABVIEW是并行的,多线程的,但是具体到这个SUBVI,却是有顺序的,需要控制权的,因此,LABVIEW很容易对SUBVI进行缓存重用。

所以,对全局变量,尤其是针对数组或者字符串,尽管它可以直接被调用,最好也要封装成一个SUBVI来使用,这样可以极大提高内存使用效率,同时避免了竞争的问题。

在循环中调用全局变量尤其要注意,每次多全局变量的时候,LV必须先复制这个数据,看下面的例子


上面的两个图中,黑色的需要反复调用内存管理器1000次,发生1000次内存复制,而下面的只需要一次内存复制。

如果COUNTER是一个庞大的数组,程序的运行效率会有惊人的不同。

如果用SUBVI封装全局变量,不如直接用FUNCTION GLOBAL,我在其他的文章中详细介绍过。

局部变量和全局变量另外一个问题是数据竞争的问题。认为任何时刻,该全局变量或者局部变量都可以被读写,这个问题在其它语言中也存在,所以要采用临界或者互斥的方法来避免。

封装成SUBVI,对调用者来说,就实现了互相排斥,任何时刻,只能有一个调用者使用这个SUBVI。

对于编程者来说,有很多方法可以避免全局变量。

使用FUNCTION GLOBAL(也叫LV2型全局变量)
使用队列或者通告
使用用户事件结构
使用控件参考

既然说了全局变量有各种各样的问题,但不是说全局变量是毫无用途的,我用全局变量最多的是用它来定义常量。

C语言中,可以用DEFINE来定义常量。
#define pi 3.14159

同理,我们可以把常量都放在同一个GLOBAL文件中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭