2

根据其他函数的输出指定函数调用中的输入参数是否会影响性能?峰值内存使用会受到影响吗?如果我使用临时变量并在计算每个中间步骤后清除它们会更好吗?

例如:

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

就峰值内存使用率和速度而言,哪个更好?

4

2 回答 2

2

这真的取决于。

从我的头顶(意思是,我可能是错的):

MATLAB 使用惰性写入时复制方案进行变量赋值。这意味着,

a = rand(5);
b = a; 

不会创建. _ a本质b上只是一个参考。但是,当您发出

b(2) = 4;

的全部内容a将被复制到一个新变量中,b指向的位置将更改为该新副本,并写入新内容(4)。

传递参数也是如此。如果你发出

c = myFcn(a, b);

并且myFcn只从和读取数据,这些变量永远不会显式复制到函数的工作区。但是,如果它向or写入(或以其他方式进行更改),它们的内容将被复制。abab

所以,在你的特殊情况下,我认为峰值记忆

r = myFcn( [some computation] )

将等于或小于

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

如果myFcn不对 进行任何更改T,则根本不会有任何区别(除了您的更多麻烦和忘记 的风险clear)。

但是,如果myFcn 发生更改 T,则会进行深层复制,因此暂时T会在内存中两次。

找出答案的最佳方法是记住记忆进行分析:

profile -memory 
于 2013-06-20T11:41:36.047 回答
0

这不是您就“法律条文”“本身”所提出的问题的答案(如果我做出假设,请道歉),但就“法律精神”而言担心,我理解隐含的问题是“将事物写成'丑陋'的单行代码是否会带来任何显着的优化好处”,答案绝对是否定的。部分是由于 matlab 的懒惰评估,正如上面罗迪指出的那样。

所以我更喜欢第二个版本,只是因为它更具可读性。据我所知,它不会对性能产生任何影响。

于 2016-07-16T17:45:22.647 回答