使用函数而不是内联会增加运行时间

2次浏览(过去30天)
我使用64位Matlab R2014b。
我有一个大矩阵,我迭代地改变其中的一个元素,我有另一个操作,我对一个小矩阵排序。我有两个最小的工作示例,我想知道为什么一种方法比另一种方法花费更长的时间。第一个示例使用直接方法,而第二个方法使用函数来执行任务。
最小工作示例1
N_iter = 1e7;
A = 0 (n_iter,1);
B = sort(rand(1e3,1));
I = 1:n_iter
A(i) = 1;
B = sort([B(2:end);B (1)]);
结束
最小工作示例2
函数deallocating_large_matrices_function
N_iter = 1e7;
A = 0 (n_iter,1);
B = sort(rand(1e3,1));
I = 1:n_iter
A(i) = 1;
B = sortB(B(2:end),B(1));
结束
结束
函数B = sortB(B,new_entry)
B =排序([B;new_entry]);
结束
结果
下面的表格显示了使用分析器作为n_iter函数运行两个示例所花费的时间。
n_iter | time MWE1(秒)|时间MWE 2(秒)
--------------------------------------------
1e4 | 0.13 | 0.21
1e5 | 1.38 | 1.98
1e6 | 13.5 | 19.7
1e7 | 137 | 196
运行MWE 1和MWE2所需的时间呈线性增加。运行MWE 2大约要多花46%的时间。这种增长的原因是什么?
3评论
亚当
亚当 2014年12月15日
据我所知,每次调用它都会重新创建函数的工作空间,尽管我不知道在运行时对代码进行了什么样的优化——它可能足够聪明,可以将其优化掉。
我认为new_entry在你上面的代码不会占用任何新的内存,但B会,在你的子函数。这是因为即使Matlab通过值而不是引用传递数据,它也足够聪明,直到或除非数据在子函数中发生变化,否则不会获取数据的物理副本。此时,它将分配内存并将数据复制到其中,因为它不能再引用原始数据了。
如果一个变量只是输入到一个函数中,但在该函数中保持不变,我相当确定没有新的内存分配给它,它只是引用内存中的原始内存。我可能错了,如果我错了,希望有人能纠正我。

登录评论。

接受的答案

阿米特
阿米特 2014年12月15日
问题出在子函数上
函数B = sortB(B,new_entry)
B =排序([B;new_entry]);
结束
你传递一个大小为“n-1”的向量作为B,并返回相同的变量B,但大小为“n”。这需要重写和重新分配内存,换句话说,更多的时间!
试试这个:function deallocating_large_matrices_function
N_iter = 1e7;
A = 0 (n_iter,1);
B = sort(rand(1e3,1));
I = 1:n_iter
A(i) = 1;
B = sortB([B(2:end);B(1)]);
结束
结束
函数B = sort(排序)
B =排序(B);
结束
这将导致更多的可比时间。

更多答案(0)

下载188bet金宝搏

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!