微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > labview深入探索-----内存管理和缓存重用

labview深入探索-----内存管理和缓存重用

时间:01-09 来源:互联网 点击:

不显示,但是存在.

.局部变量读写了控制器和指示器.

.设置了VI属性,OPEN WHEN CALLED.

对于BLOCK的operate数据只有在BLOCK显示的情况下才发生,编译成执行文件时可以不考虑.

代码空间,包括所有子VI的代码空间在主VI载入内存时,一起载入,并长期存在,它包含的是框图编译形成的机器码.

子VI的代码空间一般比较小,但是当几百个以上的SUBVI时,这个内存占用就不能不考虑了,当你执行主VI时候,不管这段代码是否有用,它都是一直存在的.

如果是通过VI服务器动态调用的SUBVI,那代码空间是否载入,何时载入,取决于用户了.所以使用动态调用的方法可以有效地节约内存,但是同时如果经常重复调用,将影响到运行速度,节约内存是以牺牲速度为代价的.

LV内存管理是自动的,但并不是完全不可干预的,通过研究它的基本运行规则加上我们良好的编程风格,就可以提高使用效率.

看一些实际的例子.

 

因为循环计数端子数据类型是I32,占四个字节,所以1000个数据占4K字节,从循环流出的数据占数据空间4K,

最上面的图是数组索引,是读的操作,对数据流上的数据不做任何改变,所以不需要分配新的内存,而是重用了内存.而下面的图是替换数组元素.替换后数组将发生变化,因为3个并行的替换是独立的,没有先后次序,所以LV不得不为2,3处分配额外的4K+4K字节,加上循环后分配的4K字节,这样1,2,3处就一共占用了12K.

这个图中,替换是要改写数据的,索引是不需要改写的,如果替换先执行,则必须为索引部分重新分配4K内存,避免因数据改动读回错误的数据.LV的内存管理器是非常智能化的,因此,它会先执行索引操作,然后在执行替换操作,这样就重用了4K内存,因此占用数据空间还是4K.


这两个框图的功能是完全一样的,但是数据空间内存占有量是完全不同的.LV内存重用它首先选择从上到下的方式,

循环中随机数的数据类型是DOUBLE,8个字节,因此数据流出8K,1.2加上指示器的操作数据共24K,

下面的图中,在ADD的过程,它首先试图选择1的重用,但是1在乘法的输入需要,所以无法重用,因此在3处又占用了8K的字节,令人感到疑惑的是它为什么不重用2的内存那,因为它首先选的是上面的1,可见,LV的内存管理器也不是万能的.

既然LV首先选择上面的重用,那上图的字节应该是8K+8K+8K=24K啊,它为什么用的是16K那,这是另外一个原则,因为最上面的是标量,而运算结果是数组,显然标量是无法重用成数组的,因此,它选择了下面的数组输出来重用.8K+8K(指示器)=16K

从上面的图可以看出,未连接的输出并不占内存空间,因为未连接的输出没有后续的数据需要流动,所以LV并不为其分配内存.

SUBVI中的默认值也是内存空间占用比较大的,尤其是数组和字符串,它会在VI内部保持它的默认值,并随着VI一起保存在磁盘中,当然,设定默认值对子VI的调试非常有好处,如果测试完毕,不需要子VI的默认值,记住要清理掉.

还有一些主要是涉及数据类型转换的问题,结合数据类型再分析.

 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top