2013-06-20 187 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上面所指出的那样。

所以我宁愿第二个版本,只是因为它更具可读性。就我所知,它不会对性能造成任何损失。