•提升LabVIEW程序性能-优化内存管理
•内容提要
•为什么要优化LabVIEW程序内存管理
•LabVIEW的自动管理内存特性
–方便用户开发,满足一般应用需求
•LabVIEW应用程序趋向大型化,复杂化
–项目规模大,需求复杂
–数据处理量大,性能要求高
•好的编程风格帮助LabVIEW优化内存管理
–可以显著提高程序运行效率
–需要了解LabVIEW的内存分配机制
•监测VI内存占用和运行时间的工具
•帮助定位和分析程序中的瓶颈部分
•显示VI内存分配情况的工具
•帮助分析程序中各个数据变量的内存拷贝情况
–目标:消除黑点
演示:监测VI内存占用和运行时间的工具
•优化 LabVIEW程序内存管理-基础篇
•避免强制类型转换
•防止内存泄漏
•合理分配数组内存
•合理使用全局变量
•1 数据类型转换
•强制点表明连接了两种不同的数据类型
–LabVIEW中类型强制转换需要数据备份
–涉及大数组的类型强制转换会占用大量内存
•推荐的类型转换方式
•更好的解决方式是在随机数创建时进行转换
–避免转换大块数据缓存
•2 防止内存泄漏
•通常发生在文件操作或动态调用VI中
–注意关闭已打开的引用
•3 合理分配数组内存
•过多进行内存重新分配占用很大开销
•慎用可能导致内存重新分配的相关函数
–创建数组
–连接字符串
演示:LabVIEW 数组分配
•4 合理使用全局变量
ü增加程序可读性
–减少程序框图中的连线
û带来额外的内存开销
–全局变量需要数据备份
•避免对大数据变量使用全局变量
–例如大数组,图像,信号等等
•做到程序可读性和执行效率之间的平衡
演示:全局变量的内存分配
•优化 LabVIEW程序内存管理-高级篇
•利用移位寄存器shift register
•灵活使用LabVIEW自带的VI
•使用元素同址操作结构In Place Element Structure
•合理配置调用函数库节点Call Library Node
•1 Shift Register-
Jeff Kodosky的最佳创意之一!
Jeff Kodosky的最佳创意之一!
•通过使用移位寄存器,规定输出端数据重用输入端数据内存,节省内存开销
•举例:将输入数组的前半部分增大10倍
演示:移位寄存器的使用
查找并替换数组中的值
•2 灵活使用LabVIEW自带的VI
•基本线性代数子程序VI
(Basic Linear Algebra Subroutines)
–合理归并基本线性代数操作
–减少不必要的内存复制开销
–使程序更加简洁
演示:使用BLAS VI进行矩阵-向量乘法
•3 元素同址操作结构
•更新数组或簇中的元素时,避免元素数据备份
•元素同址操作结构的优点
•方便实现多种情况的缓存重用,消除元素复制开销
–数组索引和替换
–簇的绑定和解除绑定
–波形的绑定和解除绑定
–变体的缓存重用
–任意元素的缓存重用
•举例:数组索引和替换
•将数组第2个元素增大10倍
•举例:簇的绑定和解除绑定
•个人纳税信息的更新
演示:嵌套的元素同址操作结构
更新数组中单数号元素
•4 合理配置调用函数库节点
•调用库函数节点中的Constant选项
–只有输入端,没有输出端,并确保在所调用的函数中没有修改所输入的数据
–此时选中Constant选项,LabVIEW不会对输入数据进行备份
演示:配置调用库函数节点
•总结
•优化LabVIEW程序内存管理可以显著提高效率
•利用内存分配显示工具检查内存分配情况
•慎用可能导致内存分配的函数和全局变量
•灵活使用缓存重用技术
–移位寄存器 shift register
–元素同址操作结构
目标:尽量消除代表内存分配的黑点!!