之前看過一些文章,多半鼓勵使用property node的value來取代local variable的使用。
不知道是我的觀念錯誤或是使用方法錯誤,今天突發奇想想要測試一下兩者之間的執行效率問題,我發現了一個很可怕的數據...
兩者的測試方塊圖如下:


然後執行時間使用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 的使用量。
可以參考底下的比較圖:

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

劣:

那請問往後在做資料傳遞上(迴圈到迴圈、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不會新配置新的位置嗎?
我有點混淆了
這是使用LabVIEW內建的Profile功能.
Tool>>Advanced>>Profile VIs

還有,yao說的"和之前的討論有出入",是哪一篇呢?
[QUOTE=jimmy-Chen]
還有,yao說的"和之前的討論有出入",是哪一篇呢?
[/QUOTE]
http://labview.com.tw/forum/forum_posts.asp?TID=1297
在後面幾篇,是由菜鳥開始說起
這個議題不弄清楚一點不行,會影響以後寫程式的方法
有意見的請盡量發言,才可以有更明確的結論
或許應該找一些國外相關討論資料或是尋求國外討論區的協助吧.
我是覺得,基本上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)」
圖檔:

詳細請參考附加程式,有興趣的人可以試著放在 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
在後面幾篇,是由菜鳥開始說起
這個議題不弄清楚一點不行,會影響以後寫程式的方法
有意見的請盡量發言,才可以有更明確的結論
[/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 回覆了。
對呀,有時是個滿討厭的問題。
Functional Global 雖然可以解決 Race Condition 的問題,
但是卻無法決定發生 Race Condition 的程式區塊之執行順序,
要解決執行順序問題,就得借用 Synchronization 的技術了。
跟大家提一下,
Functional Global 不可以設定為 Reentrant,
否則會失去功能。
所以,利用Queue Operations或Notifier Operations來達到Global Variable的功能,我個人是覺得不錯的選擇喔~
我另外用Notifier Operation來做一樣的測試.大參考看看吧!




剛剛我又把此篇文章仔細看過一變,
就我目前了解Property及Local的認知,大概說一下
有錯誤的地方麻煩,幫我修正觀念,看過了jimmy-chen
所舉的測試例子,Property比Local優異的地方在於他被呼叫的次數比較少,
相對的就節省了CPU的使用率,Local雖然執行的次數較多看是整體比較起來
時間上還是比Property少,記憶體的使用量也比Property來的少,唯讀CPU使用率較高而已,是這樣說明嗎?
其實我一直以為Property的功用應該是主要針對元件屬性變更才對,
而參數傳遞方面,還是以Local為主,只是Property同要也可以設定Value,達
到與Local做同樣的資料處理,一直以來我還是只能聽別人說,但是現在能以程
式執行時間、記憶體使用量來看清楚,我會針對我的大程式以Propert為主及Local
為主分別測試一變看看其效率如何。
<?:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
請問我以上的簡短說明是否觀念麻煩指教,謝謝。
[QUOTE=菜鳥]
剛剛我又把此篇文章仔細看過一變,
就我目前了解Property及Local的認知,大概說一下
有錯誤的地方麻煩,幫我修正觀念,看過了jimmy-chen
所舉的測試例子,Property比Local優異的地方在於他被呼叫的次數比較少,
相對的就節省了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 也可以讀取及寫入該控制(顯示)元的值。