LabVIEW 程序的內(nèi)存優(yōu)化---阮奇楨_第1頁
LabVIEW 程序的內(nèi)存優(yōu)化---阮奇楨_第2頁
LabVIEW 程序的內(nèi)存優(yōu)化---阮奇楨_第3頁
LabVIEW 程序的內(nèi)存優(yōu)化---阮奇楨_第4頁
LabVIEW 程序的內(nèi)存優(yōu)化---阮奇楨_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 LabVIEW 1程序的內(nèi)存優(yōu)化Memory Optimize for LabVIEW Programs 阮奇楨Qizhen Ruan, Biomedical Engineering Department, Shanghai Jiao Tong University ruanqizhen摘 要 :LabVIEW 語言在我國(guó)推廣普及已經(jīng)有五六年的時(shí)間了。 隨著 LabVIEW 應(yīng)用范圍的拓寬, 用戶對(duì) LabVIEW 編程產(chǎn)品的要求已經(jīng)不再僅僅簡(jiǎn)單滿足于完成基本功能,對(duì)于程序性能的要求已越來越迫切。本文針對(duì) LabVIEW 在內(nèi)存優(yōu)化中的幾個(gè)方面進(jìn)行了討論,以期對(duì) LabVIEW 軟件開發(fā)人員

2、編程時(shí)提高程序性能有所幫 助。Abstract:Finishing the functionality is not enough for many LabVIEW applications. It s also required high performance. This paper introduces some of the most efficient way to optimize the memory usage of LabVIEW program.關(guān) 鍵 詞 :LabVIEW 程序設(shè)計(jì) 虛擬儀器 內(nèi)存 優(yōu)化Keywords: LabVIEW Programming Optim

3、izeVirtual InstrumentsMemory一 . VI 在內(nèi)存中的結(jié)構(gòu)打開一個(gè) VI 的屬性面板(VI Properties ,其中的“內(nèi)存使用” (Memory Usage 是用來 查看這個(gè) VI 內(nèi)存占用情況的 1。它顯示了一個(gè) VI 內(nèi)存占用所包含的四個(gè)主要部分:前面板、 框圖、代碼和數(shù)據(jù),以及這四個(gè)部分的總和。但在打開一個(gè) VI 時(shí),這四段內(nèi)容并不是同時(shí)都 會(huì)被 LabVIEW 調(diào)入內(nèi)存的。當(dāng)我們打開一個(gè)主 VI 時(shí), 主 VI 連同它的所有子 VI 的代碼和數(shù)據(jù)段都會(huì)被調(diào)入內(nèi)存。 由 于主 VI 的前面板一般情況下是打開的,它的前面板也就同時(shí)被調(diào)入內(nèi)存。但是此時(shí)主 VI

4、 的 框圖和子 VI 的前面板、 框圖并沒有被調(diào)入內(nèi)存。 只有當(dāng)主動(dòng)查看主 VI 的框圖或是打開子 VI 的前面板和框圖時(shí),它們才會(huì)被調(diào)入?;?LabVIEW 的這種內(nèi)存管理的特性,我們?cè)诰帉?VI 的時(shí)候可以通過以下方法來優(yōu)化 LabVIEW 程序的內(nèi)存使用。第一, 把一個(gè)復(fù)雜 VI 分解為數(shù)個(gè)子 VI 。 子 VI 的使用會(huì)增添額外的前面板和框圖的空間, 但并不增添額外的代碼和數(shù)據(jù)空間。由于程序運(yùn)行時(shí)只有代碼和數(shù)據(jù)被調(diào)入內(nèi)存,因此使用 子 VI 不會(huì)占用額外的內(nèi)存。使用子 VI 的好處還在于當(dāng)子 VI 運(yùn)行結(jié)束時(shí), LabVIEW 可以及 時(shí)收回子 VI 的數(shù)據(jù)空間,從而改善了內(nèi)存的使用

5、效率。第二,在沒有必要時(shí)不要設(shè)置子 VI 的重入(Reentrant 屬性。重入型 VI 每次運(yùn)行時(shí)都 會(huì)對(duì)自己使用的數(shù)據(jù)生成一個(gè)副本,這增加了內(nèi)存開銷。第三,主 VI 的面板通常就是用戶界面,需要顯示給用戶。但是要盡量避免開啟子 VI 前 面板。比如,在子 VI 中使用與其前面板控件有關(guān)的屬性節(jié)點(diǎn)(Property Node會(huì)導(dǎo)致它的前 面板被調(diào)入內(nèi)存中, 增加了內(nèi)存開銷, 所以要盡量避免在子 VI 中使用主面板控件的屬性節(jié)點(diǎn) 來設(shè)置控件的值,而可以用局部變量等方法來替代。第四,我們可以放心地在 VI 的前面板和框圖里添加圖片,注釋等信息來幫助你編寫、維 護(hù) LabVIEW 程序,這些幫助信

6、息不會(huì)在 VI 運(yùn)行時(shí)占用內(nèi)存。二 . 內(nèi)存泄漏。LabVIEW 與 C 語言不同,它沒有任何分配或釋放內(nèi)存的語句, LabVIEW 可以自動(dòng)管理 內(nèi)存,在適當(dāng)?shù)臅r(shí)候分配或收回內(nèi)存資源 1。這樣就避免了 C 語言中常見的因?yàn)閮?nèi)存管理語 句使用不當(dāng)而引起的內(nèi)存泄漏。在 LabVIEW 中一般只有一種情況能夠引起內(nèi)存泄漏, 即你打開了某些資源, 卻忘記了關(guān) 閉它們。比如,在對(duì)文件操作時(shí),我們需要先打開這個(gè)文件,返回它的句柄。隨后如果忘記 了關(guān)閉這個(gè)句柄,它所占用的內(nèi)存就始終不會(huì)被釋放,從而產(chǎn)生內(nèi)存泄漏。 LabVIEW 中其它 帶有打開句柄的函數(shù)或 VI 也會(huì)引起同樣的問題。由于內(nèi)存泄漏是動(dòng)態(tài)產(chǎn)生

7、的,我們無法通過 VI 的屬性面板來查看,但可以通過 Windows 自帶的任務(wù)管理工具來查看 LabVIEW 程序內(nèi)存是否有泄漏。 也可以使用 LabVIEW 的 Profile (Tools>>Advanced>>Profile VIs工具來查看某個(gè) VI 運(yùn)行時(shí)內(nèi)存的分配情況。三 . 緩存重用LabVIEW 程序主要是數(shù)據(jù)流驅(qū)動(dòng)型的。數(shù)據(jù)傳遞到不同節(jié)點(diǎn)時(shí)往往需要復(fù)制一個(gè)副本。 這是 LabVIEW 為了防止數(shù)據(jù)被節(jié)點(diǎn)改變引起錯(cuò)誤所做的一種數(shù)據(jù)保護(hù)措施。只有當(dāng)目標(biāo)節(jié) 點(diǎn)為只讀節(jié)點(diǎn),不可能對(duì)輸入數(shù)據(jù)作任何更改時(shí),才不在這些節(jié)點(diǎn)處做備份。例如,數(shù)組索 引節(jié)點(diǎn)(Index

8、 是不會(huì)改變數(shù)組值的, LabVIEW 在這里就不為輸入數(shù)組做備份。對(duì)于加減 法運(yùn)算等肯定改變輸入數(shù)據(jù)的節(jié)點(diǎn), LabVIEW 往往需要對(duì)輸入或輸出數(shù)據(jù)作備份。有些 LabVIEW 程序,比如涉及到大數(shù)組運(yùn)算的程序,內(nèi)存消耗極大。其主要原因就是 LabVIEW 在運(yùn)算時(shí)為數(shù)組數(shù)據(jù)生成了過多的副本。實(shí)際上很多 LabVIEW 節(jié)點(diǎn)是允許使用緩存重用的, 這類似 C 語言調(diào)用子函數(shù)所使用的地 址傳遞。通過合理設(shè)計(jì)和使用緩存重用節(jié)點(diǎn),可以大大優(yōu)化 LabVIEW 程序的內(nèi)存使用。使 用 LabVIEW 7.1的 Tool>>Advanced>>Show Buffer Allo

9、cations工具可以在 VI 框圖中查看緩存 的分配情況 1。打開該工具,凡是在框圖中有緩存分配的地方,都會(huì)顯示出一個(gè)黑點(diǎn) 2。 下面是幾個(gè)最常用節(jié)點(diǎn)的試驗(yàn)結(jié)果。 LabVIEW 節(jié)點(diǎn)眾多,不可能一一列舉,文中未提及 的節(jié)點(diǎn)讀者在編程時(shí)自己可以嘗試。1. 一 般順序執(zhí)行 VI 中的運(yùn)算節(jié)點(diǎn) 如圖 1所示,程序?qū)σ粋€(gè)常量加 1,然后將結(jié)果輸出。 “ +1”節(jié)點(diǎn)輸出端有一個(gè)黑點(diǎn),表 示 LabVIEW 在此處開辟了一個(gè)緩存用于保存運(yùn)算結(jié)果。其實(shí)完全可以利用輸入數(shù)據(jù)的內(nèi)存 空間來保存這個(gè)運(yùn)算結(jié)果。我們可以通過如下的方法來告知 LabVIEW 編譯器,在此運(yùn)算節(jié) 點(diǎn)處重用輸入數(shù)據(jù)的內(nèi)存空間。首先,用

10、一個(gè)控制型數(shù)值控件代替圖中的數(shù)值常量,然后分別將 VI 中的兩個(gè)控件與 VI 的接線器(Connector Pane相連。圖 2是經(jīng)過我們優(yōu)化后的 VI , LabVIEW 在“ +1”節(jié)點(diǎn)處 沒有開辟新的緩存。 LabVIEW 中其它運(yùn)算節(jié)點(diǎn)也有類似的性質(zhì)。2. 移 位寄存器(Shift Register in the Loop Structure移位寄存器是 LabVIEW 內(nèi)存優(yōu)化中最為重要的一個(gè)節(jié)點(diǎn), 因?yàn)橐莆患拇嫫髟谘h(huán)結(jié)構(gòu)兩 端的接線端是強(qiáng)制使用同一內(nèi)存的 1。 這一特性可以被用來通知 LabVIEW 在編譯循環(huán)內(nèi)代碼 時(shí),重用輸入輸出緩存。 讓我們分析一下圖 3所示的程序:它首先

11、構(gòu)造了一個(gè)數(shù)組,然后對(duì)這個(gè)數(shù)組進(jìn)行了幾次 數(shù)學(xué)運(yùn)算。每一步運(yùn)算, LabVIEW 都要開辟一塊緩存用以保存運(yùn)算結(jié)果的副本。打開 VI 屬 性面板上的內(nèi)存使用,可以看到這個(gè) VI 大約會(huì)占用 2.7M 的內(nèi)存空間。其實(shí)這些副本都是不 必要的,每一步運(yùn)算的結(jié)果都可以被保存到輸入數(shù)據(jù)的內(nèi)存空間。我們可以把所用的運(yùn)算節(jié) 點(diǎn)都放到一個(gè)子 VI 中,然后利用上一段提到的方法,使子 VI 中的代碼緩存重用。還有一種 方法,利用移位寄存器也可以實(shí)現(xiàn)緩存重用。圖 1: 簡(jiǎn)單的順序執(zhí)行程序圖 2: 實(shí)現(xiàn)緩存重用圖 3: 對(duì)數(shù)組進(jìn)行數(shù)值運(yùn)算的順序執(zhí)行程序 圖 4:利用移位寄存器實(shí)現(xiàn)緩存重用如圖 4, 我們可以將運(yùn)算

12、代碼放在一個(gè)只運(yùn)行一次的循環(huán)結(jié)構(gòu)內(nèi), 由于運(yùn)算部分的輸入和 輸出都與移位寄存器相連, 這就相當(dāng)于通知了 LabVIEW , 在運(yùn)算的輸入輸出需要使用同一塊 緩存。 因而, LabVIEW 不再為每一步運(yùn)算開辟新的緩存而是直接利用輸入數(shù)據(jù)的緩存保存結(jié) 果。打開 VI 屬性面板上的內(nèi)存使用,可以查看到這個(gè) VI 的內(nèi)存占用已經(jīng)減少到了原來的六 分之一。3. 庫 函數(shù)調(diào)用節(jié)點(diǎn)(Call Library Node以傳遞整型參數(shù)為例:在參數(shù)配置面板,我們可以選擇值傳遞(Pass Value或選擇指針 傳遞(Pass Pointer to Value。當(dāng)選擇了值傳遞時(shí),庫函數(shù)調(diào)用節(jié)點(diǎn)是不會(huì)改變?cè)搮?shù)的內(nèi)容

13、的。如果我們?cè)谠搸旌瘮?shù) 調(diào)用節(jié)點(diǎn)參數(shù)的左側(cè)接線端引入輸入數(shù)據(jù),在輸出端引出輸出參數(shù),那么輸出數(shù)據(jù)其實(shí)是直 接由輸入數(shù)據(jù)引出的, LabVIEW 不會(huì)在這個(gè)節(jié)點(diǎn)處開辟緩存。在指針傳遞方式時(shí), LabVIEW 則認(rèn)為傳入的數(shù)據(jù)會(huì)被改變。如果輸入數(shù)據(jù)同時(shí)還要發(fā)往 其它節(jié)點(diǎn), LabVIEW 會(huì)在此處開辟緩存,為輸入數(shù)據(jù)作一個(gè)副本。選用指針傳遞方式,庫函 數(shù)調(diào)用節(jié)點(diǎn)的每一對(duì)接線端也同樣是緩存重用的。就是說,庫函數(shù)調(diào)用節(jié)點(diǎn)的輸出值是直接 存放在輸入值的緩存空間的。如果一個(gè)參數(shù)只用作輸出,我們通常會(huì)在庫函數(shù)調(diào)用節(jié)點(diǎn)的輸入接線端為它建立一個(gè)輸 入常數(shù),這個(gè)常數(shù)的地址空間并不能直接被利用,它只是為庫函數(shù)調(diào)用節(jié)

14、點(diǎn)開辟的緩存而設(shè) 置的初始值。不接輸入常數(shù), LabVIEW 也會(huì)為此參數(shù)開辟一塊緩存。但是,這樣每次傳入的 參數(shù)值都會(huì)有變化。例如圖 5,庫函數(shù)調(diào)用節(jié)點(diǎn)調(diào)用的函數(shù)功能是為把輸入的值加 1,然后輸 出。圖 5-a 中的輸出值永遠(yuǎn)都是 1,而圖 5-b ,每次運(yùn)行輸出結(jié)果都會(huì)比前次增加 1。這是因 為庫函數(shù)調(diào)用節(jié)點(diǎn)每個(gè)指針傳遞的參數(shù)的輸入輸出用的是同一塊緩存,即每次運(yùn)行輸入值是 上回的輸出值。 我們可以利用圖 5-c 的例子證明 LabVIEW 某些節(jié)點(diǎn)是緩存重用的。 每次運(yùn)行 5-c 的例子, 輸出結(jié)果都會(huì)比前次增加 2。這是因?yàn)槭纠械膮?shù)接線端以及“ +1”節(jié)點(diǎn)的輸入輸出端所 使用的都是同一緩存。在圖 5中的示例中,如果庫函數(shù)調(diào)用節(jié)點(diǎn)輸出的參數(shù)是個(gè)數(shù)組或者字符串,那么就必須 為它相對(duì)應(yīng)的輸入端聯(lián)入一個(gè)與輸出數(shù)據(jù)大小一致的數(shù)組或字符串。 否則, LabVIEW 無法知 道輸出數(shù)據(jù)的大小,而使用默認(rèn)分配的緩存空間很容易出現(xiàn)數(shù)組越界錯(cuò)誤。四 . 小結(jié)緩存重用是 LabVIEW 內(nèi)存優(yōu)化的最重要的一個(gè)環(huán)節(jié)。精心設(shè)計(jì)的 LabVIEW 程序可以大 大節(jié)約內(nèi)存的占用,提高運(yùn)行效率。但是,在編寫完程序后再按照程序優(yōu)化的技巧回頭去優(yōu) 化一段已有的程序,這并不是一個(gè)好的編程方法。我們

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論