有關陣列 執行效能與記憶體管理的問題

想請教站上的高手

由於所開發的應用軟體會發生memory leak 進而記憶體膨脹容易造成系統當機

有上網查詢相關議題, 大部分都是建議在array 使用上的提醒, 個人簡略整理如下

1. 盡量避免在迴圈中使用[build array]&[Insert to array]等方式

2. 在迴圈中使用[shift register] 會比 [tunnel] 來得有效率

3. 可以使用[Tools]->[Advanced]->[Show buffer location]來查詢labview在程式裡哪些地方會產生buffer的地方, 基本上越少效率越高

因此附上測試vi, 使用四種不同方式....輸出是一樣的

我也有點困惑, 哪一種會比較好?? 若有錯誤的地方,也歡迎不吝指教

方法1.vi,方法2.vi,方法3.vi,方法4.vi

你所問的四種寫程式的方法分別為:

一、
![](upload://hZsP3Ex1dTbLIutyiJgFXyhiard.png)

 

二、
![](upload://dqrusZd8K6GKJgmJpCIOfBIrt3O.png)

 

三、
![](upload://xnS1nnL7KtJaBFgcp0kq598CKBi.png)

 

四、
![](upload://vd4qAnO111N6GK1TOTfubIxovyv.png)

 

我認為是第二種比較好,因為它有使用結構通道。

 

還有,你寫錯了喔,「在迴圈中使用[shift register] 會比 [tunnel] 來得有效率」是錯的。

正確應該是說:「在迴圈中使用[tunnel] 會比 [shift register] 來得有效率,因為在一開始即規劃了array的大小,比較節省時間。,如果使用[shift register + build array]的話,會因為每次迴圈都要再次規劃array大小,而浪費了cpu的時間。

嗨 Benjamin

感謝你的回覆, 不過我再NI的網站有查到一些資料, 如下

http://forums.ni.com/ni/board/message?board.id=170&message.id=121479&query.id=551211#M121479
http://forums.ni.com/ni/board/message?board.id=170&message.id=229889&view=by_date_ascending&page=3

另外, tunnel vs shift register 在迴圈使用效率, 相關資訊要在哪裡取得??

先謝謝囉

shift register 和 index tunnel用途原本就不太一樣,其實我覺得沒必要比較
如果只是單純data進出loop,只要用一般的tunnel即可
會使用shift register是因為你要把這一筆data用在下一次處理,所以放在shift register暫存
而使用index tunnel一定是這一筆data直接要出loop,而又要存成array型式才用
所以三者的用法稍微不太一樣
當然如果你不會用shift register及index tunnel的話
利用一些寫法的改變,一般的tunnel也絕對可以達到你要的目的
只是LabVIEW提供你兩種優化的使用方式
就你四種寫法看來,因為最後出loop都是要存成array
不用用probe去測就知道第2種效率一定比較好

這裡有一個實際的測試程式,可以測試四種不同製作Array方法的效能,你可以測試看看:build array comparison.vi

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

![](upload://4u6c0Y3FnzTD5xglcnPHXtyQq1F.jpeg)

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

![](upload://1MZJC4epGM3zinx7auAdpPt0qvP.jpeg)

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