《LabVIEW程序的内存优化之子VI的优化4420.docx》由会员分享,可在线阅读,更多相关《LabVIEW程序的内存优化之子VI的优化4420.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、LabVVIEWW程序的的内存优优化 2 -子 VII的优化化1.子 VI参参数的缓缓存重用用数据据在子 VII间传入入传出,如如果程序序设计的的好,可可以做到到缓存重重用,使使得数据据在主 VII和子 VII中都不不发生拷拷贝,提提高程序序的效率率。我们们先来看看一下图图1所示的 VI。打开 TooolPrrofiileShhow Buffferr Allloccatiionss工具查查看一下下这个 VII中内存存分配的的情况,会会发现在在代码的的加法函函数处有有一个黑黑点。这这个黑点点说明程程序在这这里有分分配了一一块内存存,这个个内存是是用来存存储加法法运算结结果的。s图1:控控件不与与
2、接线器器相连时时,加法法处有内内存分配配为什什么加法法函数在在这里不不做缓存存重用呢呢?利用其其中一个个加数的的内存空空间来保保存计算算结果。当这这个 VII运行的的时候,图2中,加数 Numeric的数据是由 VI前面板的控件提供的。如果用户不修改控件的值,每次 VI运行,这个数值应该是保持不变的。如果加法函数在这里做缓存重用,加数或者说它对应的控件中的数据,就会在加法运算执行后被修改。这样程序就会出现逻辑上的错误。所以以把一个个这样的的控件联联在 LaabVIIEW的的运算节节点上,运运算节点点是不能能重用控控件的数数据内存存的。同同样的道道理,链链接一个个常量到到运算节节点上,节节点同样
3、样不能做做缓存重重用。在在子 VII中,没没有连到到接线器器上的输输入控件件就相当当与一个个常量。但是是,如果果我们让让 VII上的控控件与 VII的接线线器(Coonneectoor PPanee)相连,情情况就不不一样了了。如图2所示,把把三个控控件连到到接线器器上,程程序中加加法节点点上那个个黑点就就消失了了,不再再为运算算结果分分配新的的内存。图2:控控件不与与接线器器相连时时,加法法处有内内存分配配这是是因为,当当输入控控件与接接线器连连接后,LabbVIEEW就认认为这个个输入值值应当是是由子 VII的调用用者(父 VII)提供的:连到接接线器上上,逻辑辑上,这这个输入入控件就就不
4、再是是常量,而而是一个个输入变变量了。既既然是输输入变量量,子 VII 不需需要记住住输入的的数据供供下次调调用时使使用,因因此可以以把新产产生的数数据放在在输入参参数所在在的内存存,做到到缓存重重用。你可可能在想想,这个个输入参参数的内内存不一一定可以以被修改改吧,万万一它的的数据还还要在父父 VII中被其其它节点点使用呢呢?子 VII是不需需要考虑虑这点的的,输入入数据的的数据被被修改肯肯定是安安全的,这这一点是是由父 VII来保证的的。如果果输入数数据不能能被修改改,父 VI会把传传入的数数据拷贝贝一份再再传到子子 VII中去。比如如图3中的程程序,它它所调用用的子 VII就是图2中那个
5、 VI。由于于与它的的第一个个输入参参数相连连的是一一个常量量,而常常量的值值是不能能被改变变的。所所以 LaabVIIEW要要把这个个常量的的值复制制一份,再再传到子子 VII中去,以以保证子子 VII中的运运算节点点可以做做缓存重重用。图3:父父 VII中的数数据拷贝贝如果果图3中的父 VI,他也也使用与与接线器器相连的的输入控控件为子子 VII提供输输入参数数,则 LaabVIIEW会会知道,父 VI的这个数据是由再上一层 VI 提供的,这里也不需要做数据拷贝。这样,这个 VI就也做到了缓存重用。设计合理,参数在传递多个深度后都不需要开辟新内存的。从上上面的说说明中,还还可以发发现一个个
6、问题。就就是,有有时候子子 VII的改动动,会影影响父 VI的的行为,比比如是否否为传入入子 VI的数据据做个拷拷贝等等等。有时时候我们们发现改改动了一一个子 VI,它的的父 VII也需要要重新保保存,就就是由这这个原因因引起的的。2.输入入输出参参数的排排布在子子 VII的程序序框图上上,不论论代码有有多复杂杂,有多多少嵌套套的结构构,控件件终端最最好按照照这样的的方式排排布:所所有输入入参数(控制型型控件的的终端)都放在在代码的的最左端端排成一一列;所有的的输出参参数(显示型型控件的的终端)都放在在代码。比比如图4中的代代码的风风格就比比较好。图4:控控件终端端整齐的的排列在在程序框框图左
7、右右两端这首首先是为为了保证证程序有有良好的的可读性性。我们们在阅读读 LaabVIIEW代代码的时时候总是是按照从从左到右右的顺序序,所有有的参数数都排布布在一起起,我们们就可以以以数据据线为线线索,轻轻易的找找的数据据被读写写的地方方。其次次,这种种风格的的 VI,在效效率上也也比较优优化。对于一个个输入参参数(控制型型控件的的终端),如果果把它放放程序代代码的最最左侧,所所有结构构的外面面,程序序在运行行这个子子VI之前,就就可以得得到这个个参数的的确切值值了。但是是,如果果这个终终端是在在代码的的某个结结构中的的,在某某一结构构的内部部,那么么LabbVIEEW必须在在运行到到这一结结
8、构内部部的时候候,才可可以去读读这个参参数的值值,否则则可能会会引起逻逻辑上的的错误。比比如说,一一个控制制型控件件的终端端是在一一个循环环的内部部,开始始时它的的值是x。在运运行到第第n次循环环之前,这这个终端端对应的的前面板板上的控控件被人人改为一一个新的的数值y。那么么逻辑上上,在执执行第n次循环环之前,每每次用到到这个参参数时,它它的值要要保持为为x,而在在第n次循环环的时候候,又要要使用它它的新值值y。这样样的数据据所在的的内存,LabbVIEEW显然然是不能能将其重重用的,否否则下次次循环再再读它的的时候,数数据就不不正确了了。如果果这个终终端是在在所有结结构之外外,LabbVIE
9、EW则可可以根据据数据线线的链接接,明确确的判断断出在某某一节点点执行完完之后,程程序再也也不需要要用到这这个参数数的值了了,那么么 LaabVIIEW就就可以重重用它所所在的内内存,以以避免开开辟新内内存,拷拷贝数据据等操作作。这样样就提高高了程序序的内存存效率。对于于一个输输出参数数(显示型型控件的的终端),如果果它位于于某个条条件结构构的内部部,LabbVIEEW就要要考虑,程程序有可可能执行行不到这这个条件件。LabbVIEEW就会多多添加一一些代码码来处理理这种情情况,当当 VII没有运运行到这这个条件件时,要要给输出出参数准准备一个个默认值值。把这这个终端端移到所所有结构构之外,就
10、就可以省省去这部部分 LaabVIIEW自自动添加加上去的的工作和和,稍微微提高一一点效率率:)3.良好好的数据据流结构构可以优优化程序序内存效效率先看看一个程程序:图5:程程序中没没有必要要的数据据线分枝枝图5的程程序只是是一个演演示,不不必追究究它到底底实现了了什么功功能。图图中的左左半部分分是主 VI,在这这个 VII中对输输入的数数组数据据Arrray进行了了两次操操作:一一次使用用 suubVII“My Seaarchh”;另一次次使用了了数组排排序函数数。图5的右半半部分是是 suubVII“My Seaarchh”的程序序框图。需要要注意的的是,主主 VII上 Soort 1D
11、Arrray函函数那里里有个黑黑点(这个黑黑店靠近近黄色方方块的中中心,这这里看不不太清楚楚,和图图6对比一一下,就就可以发发现了),说明明这里做做了一次次内存分分配。这这是因为为Arrray的数据据被同时时传递到到了“My Seaarchh”和“Sorrt 11D AArraay”两个节节点进行行处理。这这两个操操作可能能会同时时进行,LabbVIEEW为了了安全(两个操操作对数数据的改改动不能能相互影影响,不不能同时时对一块块内存进进行读写写),就必必须为这这两个节节点准备备两份数数据在两两份内存存中。所所以在“My Seaarchh”和“Sorrt 11D AArraay”两个节节点中,
12、如如果一个个节点用用了原来来Arrray的内存存,另一一个节点点就需要要拷贝一一份数据据给自己己用。不过过,如果果看一下下“My Seaarch”的程序序框图,它它其实没没有对Arrray数据进进行任何何改动,主VI完全没有比要给“Sort 1D Array”开辟一块新内存。我们只要对程序稍作改动,就可以对此进行优化。图6是改进后的程序:图6:符符合数据据流风格格的主VI在改改进后的的程序中中,Arrray数数据首先先传入subbVI“My Seaarchh”,然后后又传出出来,继继续传给给“Sorrt 11D AArraay”函数。这这样子看看上去好好像数据据要多到到子VI中转一一圈,但但实
13、际上上,由于于子VI中Arrray输入输输出是缓缓存重用用的,实实际上相相当于只只是把数数组数据据的引用用传给了了子VI,效率率是相当当高的。而而在主 VII中,执执行“Sorrt 11D AArraay”时,LabbVIEEW知道道输入数数据现在在是这个个节点专专用的,改改了他也也是安全全的,于于是也可可以缓存存重用。图图六中,“Sorrt 11D AArraay”上的那那个小黑黑点就消消失了。图6中的的主 VI,它的的优点首首先是符符合数据据流的风风格。一一个主要要的数据据从左到到右,流流经每个个节点。这这样的程程序非常常容易阅阅读和理理解。LabbVIEEW也更更容易对对这样的的代码进进行优化化,所以以这样风风格的程程序通常常效率也也比较高高。有的的时候,利利用 LaabVIIEW的的自动多多线程特特性,书书写并行行代码,对对程序效效率有利利。比如如,程序序中某一一部分的的代码需需要较长长时间的的计算或或者读写写时间的的情况。但但是并不不是任何何时候并并行执行行都好。并并行书写写的程序序不易理理解,容容易出错错,多线线程运行行也会带带来额外外的开销销。像图图5、图6中的程程序,数数据量较较大,但但是并没没有比较较耗时的的运算操操作,或或数据读读写操作作,这样样的程序序,串行行运算比比并行效效率更高高。