使用一个函数来代替内联增加了运行时间

1视图(30天)
我用Matlab R2014b 64位。
我有一个大矩阵的迭代改变一个元素,我有另一个我一个小矩阵的操作。我有两个最小的工作的例子,我想知道为什么比另一种方法需要更长的时间。第一个例子使用了一个直接的方法,而第二种方法使用一个函数来执行这个任务。
最小的工作示例1
n_iter = 1 e7;
一个= 0 (n_iter, 1);
B =排序(兰德(e3, 1));
我= 1:n_iter
(我)= 1;
B =排序([B(2:结束);B (1)]);
结束
最小的工作示例2
函数deallocating_large_matrices_function
n_iter = 1 e7;
一个= 0 (n_iter, 1);
B =排序(兰德(e3, 1));
我= 1:n_iter
(我)= 1;
B = sortB (B(2:结束)、B (1));
结束
结束
函数B = sortB (B, new_entry)
B =排序([B;new_entry]);
结束
结果
下面的表显示了运行时间两个例子作为n_iter的函数,使用分析器。
n_iter |时间兆瓦1 (sec) |时间兆瓦2 (sec)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 e4 | 0.13 | 0.21
1 e5 | 1.38 | 1.98
1 e6 | 13.5 | 19.7
1 e7 | 137 | 196
所花费的时间运行1兆瓦和MWE2线性增加。运行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”。这需要重写和重新分配内存,换句话说,更多的时间!
试试这个:deallocating_large_matrices_function函数
n_iter = 1 e7;
一个= 0 (n_iter, 1);
B =排序(兰德(e3, 1));
我= 1:n_iter
(我)= 1;
B = sortB ([B(2:结束);B (1)]);
结束
结束
函数B = sortB (B)
B = (B);
结束
这将导致更可比。

更多的答案(0)

类别

找到更多的在调整和重塑矩阵帮助中心文件交换

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!