我的问题是:是否应该避免使用结构作为Matlab函数的输入(如果目标是获得最佳性能)?使用结构作为输入而不是其他类型的输入也存在内存问题吗?
作为一个简单的案例,最好是这样做:
function test1(struct)
var1 = struct.a
var2 = struct.b
var3 = struct.c
...
end
或者做得更好:
function test2(a,b,c)
var1 = a
var2 = b
var3 = c
...
end
修改
根据Dennis的答案,我检查了探查器内存以获得更多信息。这是结果(注意c = rand(1000)
):
┌───────────────────┬─────┬──────────┬──────────┬────────────────┬──────────────┬───────────────┬───────────┐
│Function Name │Calls│Total Time│Self Time*│Allocated Memory│Freed Memory │Self Memory │Peak Memory│
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│testfun │1 │14.332 s │1.603 s │39149952.00 Kb │39149828.00 Kb│-23470220.00 Kb│7832.00 Kb │
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│testfun>teststruct │1000 │2.815 s │2.815 s │7828000.00 Kb │7828000.00 Kb │0.00 Kb │7828.00 Kb │
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│testfun>testcell │1000 │2.800 s │2.800 s │7828000.00 Kb │7828000.00 Kb │0.00 Kb │7828.00 Kb │
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│test (MEX-function)│1000 │2.396 s │2.396 s │7830000.00 Kb │0.00 Kb │7830000.00 Kb │7832.00 Kb │
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│testfun>testvars │1000 │2.395 s │2.395 s │7828000.00 Kb │7828.00 Kb │7820172.00 Kb │7828.00 Kb │
├───────────────────┼─────┼──────────┼──────────┼────────────────┼──────────────┼───────────────┼───────────┤
│testfun>testmix │1000 │2.323 s │2.323 s │7828000.00 Kb │7828.00 Kb │7820172.00 Kb │7828.00 Kb │
└───────────────────┴─────┴──────────┴──────────┴────────────────┴──────────────┴───────────────┴───────────┘
我不明白为什么结构和细胞功能的释放存活量比其他2个更多?
答案 0 :(得分:1)
通常在编程时,做一些“简单”的事情。方式更快。在这种情况下,这似乎也适用。
这是一个函数,它调用带有struct的函数,带有struct的元素,以及单独的变量。第一个有点慢。
function testfun
load testfuninput
a=1;
b=2;
c=rand(100);
s.a=a;
s.b=b;
s.c=c;
tic
for t = 1:1000
teststruct(s)
end
toc
tic
for t = 1:1000
testmix(s.a,s.b,s.c)
end
toc
tic
for t = 1:1000
testvars(a,b,c)
end
toc
end
function teststruct(s)
s.c = s.c+1;
end
function testmix(a,b,c)
c = c + 1;
end
function testvars(a,b,c)
c = c + 1;
end
会返回类似的内容:
Elapsed time is 0.026694 seconds.
Elapsed time is 0.014959 seconds.
Elapsed time is 0.014366 seconds.
因此,采用单独变量的函数更快。
话虽如此:即使你这么做很多次,也只需要几分之一秒。因此,对于任何非平凡的函数,影响运行时不应超过其他参数。
有趣的旁注:如果删除结构的赋值并只调用s.c_1;
,则testvars的速度并没有真正改变。