關於property node 與 local variable的微妙問題

之前看過一些文章,多半鼓勵使用property node的value來取代local variable的使用。

不知道是我的觀念錯誤或是使用方法錯誤,今天突發奇想想要測試一下兩者之間的執行效率問題,我發現了一個很可怕的數據...

兩者的測試方塊圖如下:

![](upload://fR4rmsXk32yssOQitCO2vzUwyb2.jpeg)

![](upload://cpiSOTHgYCzUIFxe33rZGMnebD4.jpeg)

然後執行時間使用property node 與 local variable約為100:1

若真的是這樣子的話,使用property node不是反而增加程式運作時間嗎QQ

請各位大大解決我的迷思......

這個涉及到 Thread 的問題。

LabVIEW 是個具備管理 Multithread 的程式,
在 DAQ , File I/O , user I/O 是使用不同的 thread。

「Property Node」、「Control Reference」與「user I/O」
是使用同一個 thread。

而「user I/O」是所有 thread 中最為匱乏的。

所以如非必要,儘可能減少 Property Node 的使用量。

可以參考底下的比較圖:

![](upload://dFEtZdDXWeneZLnAK2EvaXMLZ0J.jpeg)


另外,可以在同一個 Propery Node 做完的設定,
就儘量在同一個 Poerpery Node 做完,不然每多用一個
Peoperty Node 就多佔用一份記憶體。

佳:

![](upload://3kmTKU4NLs2CDWbWsftJYY15FHM.jpeg)

劣:

![](upload://pSRa8oKFcrSILwXcHfOTtCogdbE.jpeg)


 

那請問往後在做資料傳遞上(迴圈到迴圈、TAB到TAB)

該用何種形式傳遞才會節省系統資源與加快程式執行速度呢?

我針對艾爾提出的方式做出Local Variable,Global Variable及Property Node三個時間及效能上的比較.

在上圖中的Property_Node.vi執行2次,平均時間14.2812秒,而Local_Variable.vi及Gl obal_Variable.vi各執行5次平均時間0.1187及0.0562秒.

但是值得大家討論的是,在Global_Variable.vi中,建立的Global Front Penal(Global.vi)雖然Global_Variable.vi只執行5次,但是總共呼叫Global的次數卻高達 400000次,這是因為每當執行到一次Global Variable時,就會去執行一次Global.vi.

在Global_Variable.vi中有8個Global Variable,Global_Variable.vi共執行5次,每次For Loop執行10000次,所以總執行次數400000=8X5X10000.

雖是這樣,但是執行的總時間還是只有0.25秒,平均時間=0.25/400000.

其實對整個執行時間沒有影響.

在記憶體的使用上,確是Local_Variable.vi最少,平均只有1.42k Bytes.

其次是Global_Variable.vi的2.03K+0.01K.

最後Property_Node.vi,平均2.28K.

不知道大家對這,有什麼看法?

請問一下Jimmy-Chen,你所使用的程式是自己寫的還是LabVIEW內建的範例?

另外從這篇討論看來,怎麼和之前的討論有出入,從測試數據看起來,properity node簡直是不能用,而且之前不是說用properity node不會新配置新的位置嗎?
我有點混淆了![](upload://bim7Kb3Zfl5SrPF2GFcCSDus3NW.gif)

這是使用LabVIEW內建的Profile功能.

Tool>>Advanced>>Profile VIs

還有,yao說的"和之前的討論有出入",是哪一篇呢?

[QUOTE=jimmy-Chen]

還有,yao說的"和之前的討論有出入",是哪一篇呢?

[/QUOTE]

http://labview.com.tw/forum/forum_posts.asp?TID=1297

在後面幾篇,是由菜鳥開始說起
這個議題不弄清楚一點不行,會影響以後寫程式的方法
有意見的請盡量發言,才可以有更明確的結論![](upload://wh1Jr0invKZTARRL2Hqlvc8do63.gif)

或許應該找一些國外相關討論資料或是尋求國外討論區的協助吧.

我是覺得,基本上Local及Global就已經可以達到資料傳遞的功能,不管是在同一個Vi或是Vi與Vi間.

除非要改變元件屬性,我才會使用Property Node,而且程式在執行的時候並不會一直執行到Property Node.

所以說如果要用的話,Local variable會比properity node優先考慮囉?
那我之前的觀念要重新建立了

不過global比local來得快,這倒是蠻奇特的現象,雖然呼叫比較多次,不過只是cpu累一點,但是整體如果效能比較好的 話,那都用global還比較好

[QUOTE=yao]

所以說如果要用的話,Local variable會比properity node優先考慮囉?
那我之前的觀念要重新建立了

不過global比local來得快,這倒是蠻奇特的現象,雖然呼叫比較多次,不過只是cpu累一點,但是整體如果效能比較好的 話,那都用global還比較好

[/QUOTE]

一般來說,傳送資料的方式:
優:   Control > Local > Global

原因在於 Local 及 Global 的生命週期。
以 MainVI 底下含有眾多 SubVI 來說,
Local 存在於 SubVI 執行期間
Global 存在於 MainVI 執行期間

而且每用一個 Local/Global 便多佔用一份記憶體。
(Property Node 亦同)

 

因為 LabVIEW 會自行處理記憶體,
所以當 SubVI 執行結束時,
會將用不到的的記憶體給釋放掉,
Local 在此時也會釋放掉所佔用的記憶體。

而 Global 不管是在 MainVI 或 subVI 使用,
其所佔用的記憶體會一直到 MainVI 結束執行時,
才會釋放掉。

所以 Global 不是很建議大量使用。

不過有一種叫做「Functional Global」的技術。

利用「 subVI 永遠只佔用同一份記憶體的特性」、
(除非是設定為Reentrant)
「Loop 的 Shift Register 可記憶資料」等,
來達到利用 subVI 來模擬 Global 的效果。

另外注意底下紅色框選的部分,
「Shift Register 不接初始值以保留前次資料」、
「Loop 只執行一圈即結束 (只為了利用其 Shift register)」

圖檔:

![](upload://6SP7XPdzT6P82nagw5tuncPAhrs.jpeg)

 


詳細請參考附加程式,有興趣的人可以試著放在 MainVI 的 subVI
裡頭,看看是不是跟使用 Global 是一樣效果:

2004-07-13_093449_Numeric_Functional_Global.vi

 

 

PS: 有不少 LabVIEW 內建 VI 即用到此一技術。
      比方說 File I/O -> Configuration File VIs

 

[QUOTE=yao][QUOTE=jimmy-Chen]

還有,yao說的"和之前的討論有出入",是哪一篇呢?

[/QUOTE]

http://labview.com.tw/forum/forum_posts.asp?TID=1297

在後面幾篇,是由菜鳥開始說起
這個議題不弄清楚一點不行,會影響以後寫程式的方法
有意見的請盡量發言,才可以有更明確的結論![](upload://wh1Jr0invKZTARRL2Hqlvc8do63.gif)

[/QUOTE]

抱歉哪篇討論確實是我發表的,因為當時程式必須用到大量的

參數傳遞,因為我主要是做硬體功能驗證,大約有70個左右的功能,

主程式跟設定畫面又是分開的狀態,所以當時蠻擔心的,整成的主程式

已經超過4M了,今天來這邊看了一下,我也蠻擔心的雖然還沒狀況發生,

而且我發覺這邊越來越多高手了,好高興喔!

 

Functional Global的方式,雖然可以做到Global的功能.但是,是不是真的能比Global的效能更好呢?

大家可以比較看看喔...

 

[QUOTE=jimmy-Chen]

Functional Global的方式,雖然可以做到Global的功能.但是,是不是真的能比Global的效能更好呢?

大家可以比較看看喔...

[/QUOTE]

[上述圖例省略]

 Functional Global 有一個特性:可以避免 Race Condition

主要原因是,
凡是非設定為 Reentrant 的 VI ,
同時間該 VI 只能被執行一次。

詳細可以考一下底下範例:

2004-07-14_193301_Thread_Exercise.llb


 

提到這個並不是說 Local、Global、Functional Global
何者有多糟、何者有多好。

重要的是了解其特性,
知道在使用時對程式會造成什麼影響,
再去選擇最適何的寫作程式方法。

其實便利、效率,有時候還真的很難兼顧。

 

嗯~沒錯

Race Condition的發生會造成Debug上的困擾.

[QUOTE=jimmy-Chen]

嗯~沒錯

Race Condition的發生會造成Debug上的困擾.

[/QUOTE]

剛要補充,就見 jimmy-Chen 回覆了。![](upload://wh1Jr0invKZTARRL2Hqlvc8do63.gif)

對呀,有時是個滿討厭的問題。
Functional Global 雖然可以解決 Race Condition 的問題,
但是卻無法決定發生 Race Condition 的程式區塊之執行順序,
要解決執行順序問題,就得借用 Synchronization 的技術了。

跟大家提一下,
Functional Global 不可以設定為 Reentrant,
否則會失去功能。

所以,利用Queue Operations或Notifier Operations來達到Global Variable的功能,我個人是覺得不錯的選擇喔~

我另外用Notifier Operation來做一樣的測試.大參考看看吧!

 

剛剛我又把此篇文章仔細看過一變,

就我目前了解PropertyLocal的認知,大概說一下

有錯誤的地方麻煩,幫我修正觀念,看過了jimmy-chen

所舉的測試例子,PropertyLocal優異的地方在於他被呼叫的次數比較少,

相對的就節省了CPU的使用率,Local雖然執行的次數較多看是整體比較起來

時間上還是比Property少,記憶體的使用量也比Property來的少,唯讀CPU使用率較高而已,是這樣說明嗎?

其實我一直以為Property的功用應該是主要針對元件屬性變更才對,

而參數傳遞方面,還是以Local為主,只是Property同要也可以設定Value,達

到與Local做同樣的資料處理,一直以來我還是只能聽別人說,但是現在能以程

式執行時間、記憶體使用量來看清楚,我會針對我的大程式以Propert為主及Local

為主分別測試一變看看其效率如何。

 <?:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

請問我以上的簡短說明是否觀念麻煩指教,謝謝。

 

[QUOTE=菜鳥] 

剛剛我又把此篇文章仔細看過一變,

就我目前了解PropertyLocal的認知,大概說一下

有錯誤的地方麻煩,幫我修正觀念,看過了jimmy-chen

所舉的測試例子,PropertyLocal優異的地方在於他被呼叫的次數比較少,

相對的就節省了CPU的使用率,Local雖然執行的次數較多看是整體比較起來

時間上還是比Property少,記憶體的使用量也比Property來的少,唯讀CPU使用率較高而已,是這樣說明嗎?

其實我一直以為Property的功用應該是主要針對元件屬性變更才對,

而參數傳遞方面,還是以Local為主,只是Property同要也可以設定Value,達

到與Local做同樣的資料處理,一直以來我還是只能聽別人說,但是現在能以程

式執行時間、記憶體使用量來看清楚,我會針對我的大程式以Propert為主及Local

為主分別測試一變看看其效率如何。

 <?:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

請問我以上的簡短說明是否觀念麻煩指教,謝謝。

 

[/QUOTE]

「# Runs」指的是 VI 被執行的次數。

在你看到的圖例中,
Property_Node.vi     2 次
Local Variable.vi      5 次
Global Variable.vi     5 次
Global.vi        400000 次

前三者都是 Main VI ,並且分別按下了 Run 鍵 2、5、5 次,
執行這些次數是為了取時間及記憶體使用的分析值之平均。

( Global.vi 是被 Global Variable.vi 所呼叫的一個 廣義變數,
其次數 400000 次 = 8個Global x 迴圈數 10000圈 x 執行數5次 )

在這些分析圖例,你所要看的是它所用掉的平均時間及記憶體。

 

Property Node ,顧名思義,
主要是用來讀取及寫入控制(顯示)元的本身的「屬性」,
而 Value 也是屬性的一種,
所以用 Property Node 也可以讀取及寫入該控制(顯示)元的值。

附上程式,有興趣的試試看吧.

2004-07-15_134817_Compare_Variable.llb