本文结合网络资料和实际运用经验,谈一谈提升LabVIEW程序性能,重点如何优化LabVIEW程序的内存管理。LabVIEW作为高级语言,忽略底层,都是调用封装好的高级函数来实现程序功能。在内存管理方面,LabVIEW的自动管理内存特性可以满足一般需求,但是在大型的项目中需要了解LabVIEW的内存分配机制,需要开发人员有意识的调优,并且好的编程风格、良好的习惯对于程序稳健性也关系重大。
本文大部分资料都是基于内存优化的一个PTT资料,但作者无从考究,在此表示感谢。
1、为什么要优化LabVIEW程序内存管理
1.1、LabVIEW是一个自动管理内存的开发语言。作为高级语言,方便用户开发,满足一般应用需求。
1.2、LabVIEW应用程序趋向大型化,复杂化。项目规模大,需求复杂并且数据处理量大,性能要求高。比如大数组在设计开发时就要避免使用局部或者全局变量,因为内存副本复制会消耗内存。在循环中,基于性能要求,需要对程序循环进行延时,延时1ms和不延时的CPU占用也是不一样的。因此,对于程序的优化,如何提高内存管理效率,优化内存管理,提高执行效率,就显得日益重要了。
1.3、好的编程风格帮助LabVIEW优化内存管理,可以显著提高程序运行效率,这需要开发人员了解LabVIEW的内存分配机制。一个风格良好,节省内存分配的程序,可以比一个没有优化过的程序提高几倍,甚至十几倍的效率。
2、LabVIEW中监测VI内存占用和运行时间的工具
介绍一些在LabVIEW中非常有用的工具,可以帮助我们检测程序或VI的内存占用情况和运行时间。从而能够使我们有针对性的,有目的性的来进行优化。
2.1工具-性能分析-性能和内存工具。
监测VI内存占用和运行时间的工具,帮助定位和分析程序中的瓶颈部分。这个监测工具可以很方便的显示出每个VI的运行时间,内存占用大小,等等很多有用的信息。有了这些信息,你可以很方便地找到程序中消耗内存最大,执行时间最长的部分。这些部分就是制约程序效率的瓶颈。对其有针对性地进行优化,就可以起到事半功倍的效果。
2.2工具-性能分析-显示缓存区分配。
帮助分析程序中各个数据变量的内存拷贝情况,目标是消除黑点。当你找到程序中消耗内存最大,效率最低的那个VI后,如何针对它来进行优化,也是一个很关键的问题。如果我修改了程序,到底效果好不好,有没有起到减少内存分配的效果,很难进行评判。LabVIEW提供了一个工具,用来帮助我们分析VI里各个数据变量的内存复制情况。大家可以在工具,性能分析里找到一个显示缓存区分配工具。运行这个工具,LabVIEW会把程序框图中有内存复制的地方用一个黑点标识出来,你可以看到程序中的内存分配情况。而且你可以有选择地看自己感兴趣的变量,比如数组的,簇的,等等。
3、优化LabVIEW程序内存管理
详细介绍一下在LabVIEW程序中优化内存使用效率,从而提升整个程序执行效率的技巧,方法和一些经验,体会。
3.1基础篇
3.1.1避免强制类型转换。程序框图中红色强制点表明连接了两种不同的数据类型,LabVIEW中类型强制转换需要数据备份,涉及大数组的类型强制转换会占用大量内存。我们在编程中要尽量保持前后数据类型一致,避免做类型转换。如果无法避免的话,也要注意避免对大块数据量进行类型转换。更好的解决方式是在数值创建时进行转换,避免转换大块数据缓存。
3.1.2防止内存泄漏。通常发生在文件操作或动态调用VI中,编程中注意关闭已打开的引用。LabVIEW是自动释放内存的,所以一般来说不会发生内存泄漏。这里所讲的内存泄漏主要发生在文件操作,或动态调用VI中。当你打开了文件的引用,进行完读写操作后,一定要注意关闭这个引用。不然LabVIEW是不会释放这个文件所占用的内存的。同样,对于动态调用VI也有类似的情况。所以,在写程序时,打开引用和关闭引用一定是要一一对应的。
3.1.3 合理分配数组内存。数组操作是一类比较常见的操作。几乎绝大部分的应用程序中都会有数组操作的函数。LabVIEW中有一些数组操作的函数是需要重新分配内存的,比如创建数组函数。而且,数组的数据量通常都比较大,频繁地进行数组内存的重新分配会带来很大的开销。过多进行内存重新分配占用很大开销,慎用可能导致内存重新分配的相关函数,比如创建数组和连接字符串。
3.1.4合理使用全局变量。就是如何在程序使用全局变量以及局部变量。有些LabVIEW的用户,特别喜欢使用全局变量。因为全局变量可以减少框图中的连线,而且可以实现多个VI之间的数据交换。比如在一个VI中写全局变量,在另一个VI中再读取它的数据。但是,LabVIEW需要对全局变量进行数据备份,因此会带来额外的内存开销。但是,也不是说要绝对地避免使用全局变量。我们要避免的,是对那些大数据量,比如图像,信号等等使用全局变量。对于一些标量,小数据量,合理地使用全局变量,并不会对整个程序增加特别大的负担。所以说,我们要做到程序可读性和执行效率之间的统一。解决方法就是使用移位寄存器或者功能全局变量。
3.2高级篇
3.2.1利用移位寄存器shift register。通过使用移位寄存器,规定输出端数据重用输入端数据内存,节省内存开销。移位寄存器可以在循环中重用地址,但是只局限于同一个面板中,这里还有一种功能全局变量,即未初始化的移位寄存器,可以在同个内存中传递数据,类似于全局变量,但不会有数据副本产生。
3.2.2灵活使用LabVIEW自带的VI。自带vi经过优化,减少内存复制,并让程序看上去更简洁。
3.2.3使用元素同址操作结构InPlace Element Structure。更新数组或簇中的元素时,避免元素数据备份。如果你的数组的元素本身就是一个复杂结构,并且这个结构本身数据量就很大的情况下,节省一个元素的备份也会带来性能的提升。元素同址操作结构方便实现多种情况的缓存重用,消除元素复制开销,可以完成数组索引和替换、簇的绑定和解除绑定、波形的绑定和解除绑定、变体的缓存重用、任意元素的缓存重用。
3.2.4合理配置调用函数库节点CallLibrary Node。调用库函数节点中的Constant选项,只有输入端,没有输出端,并确保在所调用的函数中没有修改所输入的数据。此时选中Constant选项,LabVIEW不会对输入数据进行备份。
4、总结
•优化LabVIEW程序内存管理可以显著提高效率
•利用内存分配显示工具检查内存分配情况
•慎用可能导致内存分配的函数和全局变量
•灵活使用缓存重用技术
–移位寄存器 shiftregister
–元素同址操作结构
网友评论