2013-06-20 183 views
2

根據其他函數的輸出在函數調用中指定輸入參數是否影響性能? 峯值內存使用量會受到影響嗎? 如果我使用臨時變量並在計算每個中間步驟後清除它們會更好嗎?Matlab函數參數傳遞

對於前:

g=imfill(imclearborder(imdilate(Inp_img,strel('square',5))),'holes'); 

temp1=imdilate(Inp_img,strel('square',5)); 
temp1=imclearborder(temp1); 
g=imfill(temp1,'holes'); 
clear temp1 

這將是峯值內存使用量和速度方面比較好?

+0

據我所知,使用函數調用只是使用隱藏的臨時變量被清除。有人可能會有更深入的知識。你可以嘗試兩種方式並使用'profiler'來查找,並讓我們知道是否有任何區別! –

+0

我希望這兩種解決方案都具有相同的內存密集性,除非JIT在兩種解決方案之間進行區分。另外,如果你打算重用'temp1',那麼第二種方法應該是首選的(同樣,除非JIT'爲了進一步計算而緩存'中間結果)。如果您使用的是Windows,請嘗試打開任務管理器並檢查內存使用情況的兩種解決方案。 – Oleg

回答

2

這真的取決於。

從我的頭頂(意思是,我可能是錯的):

MATLAB使用的變量賦值一個懶惰的寫入時複製方案。這意味着,

a = rand(5); 
b = a; 

創建的a明確的副本。實質上,b只是一個參考。然而,當你發出

b(2) = 4; 

a的全部內容將被複制到一個新的變量,其中b點更改爲新的副本的位置,而新的內容(4)被寫入。

傳遞參數也是如此。如果發出

c = myFcn(a, b); 

myFcn只有讀取ab數據,這些變量是從來沒有明確拷貝到函數的工作空間。但是,如果它(或以其他方式進行更改)寫入ab,則其內容將被複制。

所以,你的具體情況,我覺得峯值內存爲

r = myFcn([some computation]) 

將等於或小於

T = [some computation]; 
r = myFcn(T); 
clear T; 

如果myFcn不更改T,將有完全沒有區別(除了更多的麻煩,以及忘記clear的風險)。

但是,如果myFcn改變T,深拷貝將會進行,所以一會兒T將在內存的兩倍。

,找出最好的辦法是用記憶來分析考慮:

profile -memory 
+0

Matlab不會將像'[some computation]這樣的中間計算結果賦值給'ans'。如果整個語句(不僅僅是語句中的某個表達式)返回一個值,但是它沒有明確地分配給一個變量,'ans'變量只會被更新。基本上,如果你省略了分號就不會打印出來,它不會更新'ans'。 –

+0

@AndrewJanke:謝謝,我對細節有些模糊。編輯! –

0

這不是一個答案,你問至於「法律函」每關心」的問題(如果我正在做出假設,則表示歉意),但就「法律精神」而言,我理解這個暗示的問題是「寫作」醜陋「的單行事件是否賦予任何重大優化好處「,答案肯定不是。部分原因在於matlab的懶惰評估,正如rody上面所指出的那樣。

所以我寧願第二個版本,只是因爲它更具可讀性。就我所知,它不會對性能造成任何損失。