labview深入探索-----內(nèi)存管理和緩存重用
對于一個不顯示的子VI是不存在操作數(shù)據(jù)的,如果打開了SUBVI的前面板,則包含的控制器和指示器的操作數(shù)據(jù).
在下面的情況下,將包括操作數(shù)據(jù).
.前面板打開.
.框圖程序使用的屬性節(jié)點,導(dǎo)致前面板載入內(nèi)存,可能不顯示,但是存在.
.局部變量讀寫了控制器和指示器.
.設(shè)置了VI屬性,OPEN WHEN CALLED.
對于BLOCK的operate數(shù)據(jù)只有在BLOCK顯示的情況下才發(fā)生,編譯成執(zhí)行文件時可以不考慮.
代碼空間,包括所有子VI的代碼空間在主VI載入內(nèi)存時,一起載入,并長期存在,它包含的是框圖編譯形成的機器碼.
子VI的代碼空間一般比較小,但是當(dāng)幾百個以上的SUBVI時,這個內(nèi)存占用就不能不考慮了,當(dāng)你執(zhí)行主VI時候,不管這段代碼是否有用,它都是一直存在的.
如果是通過VI服務(wù)器動態(tài)調(diào)用的SUBVI,那代碼空間是否載入,何時載入,取決于用戶了.所以使用動態(tài)調(diào)用的方法可以有效地節(jié)約內(nèi)存,但是同時如果經(jīng)常重復(fù)調(diào)用,將影響到運行速度,節(jié)約內(nèi)存是以犧牲速度為代價的.
LV內(nèi)存管理是自動的,但并不是完全不可干預(yù)的,通過研究它的基本運行規(guī)則加上我們良好的編程風(fēng)格,就可以提高使用效率.
看一些實際的例子.
因為循環(huán)計數(shù)端子數(shù)據(jù)類型是I32,占四個字節(jié),所以1000個數(shù)據(jù)占4K字節(jié),從循環(huán)流出的數(shù)據(jù)占數(shù)據(jù)空間4K,
最上面的圖是數(shù)組索引,是讀的操作,對數(shù)據(jù)流上的數(shù)據(jù)不做任何改變,所以不需要分配新的內(nèi)存,而是重用了內(nèi)存.而下面的圖是替換數(shù)組元素.替換后數(shù)組將發(fā)生變化,因為3個并行的替換是獨立的,沒有先后次序,所以LV不得不為2,3處分配額外的4K+4K字節(jié),加上循環(huán)后分配的4K字節(jié),這樣1,2,3處就一共占用了12K.
這個圖中,替換是要改寫數(shù)據(jù)的,索引是不需要改寫的,如果替換先執(zhí)行,則必須為索引部分重新分配4K內(nèi)存,避免因數(shù)據(jù)改動讀回錯誤的數(shù)據(jù).LV的內(nèi)存管理器是非常智能化的,因此,它會先執(zhí)行索引操作,然后在執(zhí)行替換操作,這樣就重用了4K內(nèi)存,因此占用數(shù)據(jù)空間還是4K.
這兩個框圖的功能是完全一樣的,但是數(shù)據(jù)空間內(nèi)存占有量是完全不同的.LV內(nèi)存重用它首先選擇從上到下的方式,
循環(huán)中隨機數(shù)的數(shù)據(jù)類型是DOUBLE,8個字節(jié),因此數(shù)據(jù)流出8K,1.2加上指示器的操作數(shù)據(jù)共24K,
下面的圖中,在ADD的過程,它首先試圖選擇1的重用,但是1在乘法的輸入需要,所以無法重用,因此在3處又占用了8K的字節(jié),令人感到疑惑的是它為什么不重用2的內(nèi)存那,因為它首先選的是上面的1,可見,LV的內(nèi)存管理器也不是萬能的.
既然LV首先選擇上面的重用,那上圖的字節(jié)應(yīng)該是8K+8K+8K=24K啊,它為什么用的是16K那,這是另外一個原則,因為最上面的是標(biāo)量,而運算結(jié)果是數(shù)組,顯然標(biāo)量是無法重用成數(shù)組的,因此,它選擇了下面的數(shù)組輸出來重用.8K+8K(指示器)=16K
從上面的圖可以看出,未連接的輸出并不占內(nèi)存空間,因為未連接的輸出沒有后續(xù)的數(shù)據(jù)需要流動,所以LV并不為其分配內(nèi)存.
SUBVI中的默認(rèn)值也是內(nèi)存空間占用比較大的,尤其是數(shù)組和字符串,它會在VI內(nèi)部保持它的默認(rèn)值,并隨著VI一起保存在磁盤中,當(dāng)然,設(shè)定默認(rèn)值對子VI的調(diào)試非常有好處,如果測試完畢,不需要子VI的默認(rèn)值,記住要清理掉.
還有一些主要是涉及數(shù)據(jù)類型轉(zhuǎn)換的問題,結(jié)合數(shù)據(jù)類型再分析.
評論