我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc

我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc

ID:36011874

大小:417.00 KB

页数:5页

时间:2019-05-02

我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc_第1页
我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc_第2页
我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc_第3页
我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc_第4页
我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc_第5页
资源描述:

《我和LabVIEWword版——一个NI工程师十年的编程经验51-9457.LabVIEW 程序的内存优化 2 - 子 VI 的优化.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、LabVIEW程序的内存优化2-子VI的优化  1.子VI参数的缓存重用  数据在子VI间传入传出,如果程序设计的好,可以做到缓存重用,使得数据在主VI和子VI中都不发生拷贝,提高程序的效率。  我们先来看一下图1所示的VI。打开Tool>>Profile>>ShowBufferAllocations工具查看一下这个VI中内存分配的情况,会发现在代码的加法函数处有一个黑点。这个黑点说明程序在这里有分配了一块内存,这个内存是用来存储加法运算结果的。s    图1:控件不与接线器相连时,加法处有内存分配  为什么加

2、法函数在这里不做缓存重用呢?利用其中一个加数的内存空间来保存计算结果。  当这个VI运行的时候,图2中,加数Numeric的数据是由VI前面板的控件提供的。如果用户不修改控件的值,每次VI运行,这个数值应该是保持不变的。如果加法函数在这里做缓存重用,加数或者说它对应的控件中的数据,就会在加法运算执行后被修改。这样程序就会出现逻辑上的错误。  所以把一个这样的控件联在LabVIEW的运算节点上,运算节点是不能重用控件的数据内存的。同样的道理,链接一个常量到运算节点上,节点同样不能做缓存重用。在子VI中,没有连到接

3、线器上的输入控件就相当与一个常量。  但是,如果我们让VI上的控件与VI的接线器(ConnectorPane)相连,情况就不一样了。入图2所示,把三个控件连到接线器上,程序中加法节点上那个黑点就消失了,不再为运算结果分配新的内存。    图2:控件不与接线器相连时,加法处有内存分配  这是因为,当输入控件与接线器连接后,LabVIEW就认为这个输入值应当是由子VI的调用者(父VI)提供的:连到接线器上,逻辑上,这个输入控件就不再是常量,而是一个输入变量了。既然是输入变量,子VI不需要记住输入的数据共下次调用时使

4、用,因此可以把新产生的数据放在输入参数所在的内存,做到缓存重用。  你可能在想,这个输入参数的内存不一定可以被修改吧,万一它的数据还要在父VI中被其它节点使用呢?  子VI是不需要考虑这点的,输入数据的数据被修改肯定是安全的,这一点是由父VI来保证的。如果输入数据不能被修改,父VI会把传入的数据拷贝一份再传到子VI中去。  比如图3中的程序,它所调用的子VI就是图2中那个VI。由于与它的第一个输入参数相连的是一个常量,而常量的值是不能被改变的。所以LabVIEW要把这个常量的值复制一份,再传到子VI中去,以保证

5、子VI中的运算节点可以做缓存重用。    图3:父VI中的数据拷贝  如果图3中的父VI,他也使用与接线器相连的输入控件为子VI提供输入参数,则LabVIEW会知道,父VI的这个数据是由再上一层VI提供的,这里也不需要需要做数据拷贝。这样,这个VI就也做到了缓存重用。设计合理,参数在传递多个深度后都不需要开辟新内存的。  从上面的说明中,还可以发现一个问题。就是,有时候子VI的改动,会影响父VI的行为,比如是否为传入子VI的数据做个拷贝等等。有时候我们发现改动了一个子VI,它的父VI也需要重新保存,就是由这个原

6、因引起的。  2.输入输出参数的排布  在子VI的程序框图上,不论代码有多复杂,有多少嵌套的结构,控件终端最好按照这样的方式排布:所有输入参数(控制型控件的终端)都放在代码的最左端排成一列;所有的输出参数(显示型控件的终端)都放在代码。比如图4中的代码的风格就比较好。    图4:控件终端整齐的排列在程序框图左右两端  这首先是为了保证程序有良好的可读性。我们在阅读LabVIEW代码的时候总是按照从左到右的顺序,所有的参数都排布在一起,我们就可以以数据线为线索,轻易的找的数据被读写的地方。其次,这种风格的VI,

7、在效率上也比较优化。  对于一个输入参数(控制型控件的终端),如果把它放程序代码的最左侧,所有结构的外面,程序在运行这个子VI之前,就可以得到这个参数的确切值了。  但是,如果这个终端是在代码的某个结构中的,在某一结构的内部,那么LabVIEW必须在运行到这一结构内部的时候,才可以去读这个参数的值,否则可能会引起罗技上的错误。比如说,一个控制型控件的终端是在一个循环的内部,开始时它的值是x。在运行到第n次循环之前,这个终端对应的前面板上的控件被人改为一个新的数值y。那么逻辑上,在执行第n次循环之前,每次用到这个

8、参数时,它的值要保持为x,而在第n次循环的时候,又要使用它的新值y。这样的数据所在的内存,LabVIEW显然是不能将其重用的,否则下次循环再读它的时候,数据就不正确了。  如果这个终端是在所有结构之外,LabVIEW则可以根据数据线的链接,明确的判断出在某一节点执行完之后,程序再也不需要用到这个参数的值了,那么LabVIEW就可以重用它所在的内存,以避免开辟新内存,拷贝数据等操作。这样

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。