相同代码中的MATLAB速度差异

时间:2011-07-21 23:02:36

标签: optimization matlab

我有一些我一直在使用的MATLAB代码。有三个部分,比如A,B和C. A和C可以改变,B无论如何都保持不变。

我所做的是将A,B和C分成单独的.m文件(不是函数,只是脚本)。 A只创建一组变量,B包含逻辑,C包含结果的绘图。我将D文件称为文件,我所做的就是将A,B和C的全部内容直接复制/粘贴到彼此之后。

如果我运行A,然后是B,那么C,B内的迭代非常缓慢,每次迭代大约15秒。 如果我运行D(只有A然后B然后C粘贴)它会快速,每次迭代大约2秒。

鉴于MATLAB以完全相同的顺序运行完全相同的代码,为什么两者的执行时间差别如此之大?

2 个答案:

答案 0 :(得分:2)

我相信你有记忆问题。 Matlab函数实际上将它们的输入变量作为指针,但是如果你更改数据,它就会成为副本。 因此,如果A,B,C具有较大的输入和输出,并且每一个都修改了一些数据的一小部分,那么就会获得大量的内存分配。

例如:

function Main()
 x = imread('peppers.png');
 for i=1:size(x,1)
     for j=1:size(x,2)
          x = ChangePixel(x,i,j);
     end
 end
 imshow(x);
end

function A = ChangePixel(A,i,j)
    A(i,j,:) = A(i,j,[3 2 1]);
end

此代码将非常慢,因为ChangePixel每次都会分配一个新矩阵。

有时,Matlab可以检测这些操作并使用内部优化。 但是,人们无法知道它是否会发生,所以最好避免这种操作。

答案 1 :(得分:1)

如果没有可重复的例子,很难说发生了什么。我可以告诉你如何寻找自己。

关闭并重新打开MATLAB,一切都很新鲜。 (或者至少做close all hidden; clear classes; clc;。) 如果在致电DAB之前致电C,您会得到相同的时间吗?如果你没有清除它们之间的变量,那么MATLAB将不得不第二次做更少的分配。

如果时间相同,那么您需要使用分析器。 (单击桌面 - > Profiler。)配置每个脚本,并记下哪些行很慢。他们匹配了吗?你能看到任何模式吗?你确定在两种情况下都执行相同的代码吗?

如果仍然没有明显的理由为什么时间不同,那么也许Praetorian是正确的,而且这是JIT魔法的深层次。