labview深入探索-----內存管理和緩存重用
對于一個不顯示的子VI是不存在操作數據的,如果打開了SUBVI的前面板,則包含的控制器和指示器的操作數據.
在下面的情況下,將包括操作數據.
.前面板打開.
.框圖程序使用的屬性節點,導致前面板載入內存,可能不顯示,但是存在.
.局部變量讀寫了控制器和指示器.
.設置了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的默認值,記住要清理掉.
還有一些主要是涉及數據類型轉換的問題,結合數據類型再分析.
評論