在函数调用中根据其他函数的输出指定输入参数会影响性能吗? 峰值内存使用会受到影响吗? 如果我使用临时变量并在计算每个中间步骤后清除它们会更好吗?
例如:
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 :(得分:2)
这取决于。
从我的头顶(意思是,我可能是错的):
MATLAB使用惰性写时复制方案进行变量赋值。这意味着,
a = rand(5);
b = a;
将不创建a
的显式副本。从本质上讲,b
只是一个参考。但是,当您发出
b(2) = 4;
a
的全部内容将被复制到一个新变量中,b
指向的位置将更改为该新副本,并写入新内容(4)。
传递参数也是如此。如果您发出
c = myFcn(a, b);
和myFcn
只有从a
和b
读取数据,这些变量永远不会显式复制到函数的工作区。但是,如果将(或以其他方式进行更改)写入a
或b
,则会复制其内容。
因此,在您的特定情况下,我认为
的峰值内存r = myFcn( [some computation] )
将等于或小于
T = [some computation];
r = myFcn( T );
clear T;
如果myFcn
未对T
进行任何更改,则根本不会有任何差异(除非您有更多麻烦,否则可能会忘记clear
)。
但是,如果myFcn
更改 T
,则会制作一份深层副本,因此片刻T
会在内存中两次。
找出答案的最佳方法是记住记忆:
profile -memory
答案 1 :(得分:0)
对于你所问的问题,这个问题不是“法律信函”本身所涉及的问题,(如果我做出假设,我会道歉),但就“精神问题”而言。就法律而言,我理解隐含的问题是“将事情写成'丑陋的'单行者赋予任何重要的优化利益”,答案绝对不是。部分原因是由于matlab的懒惰评估,正如上面指出的那样。
所以我更喜欢第二个版本,因为它更具可读性。据我所知,它不会对性能造成任何惩罚。