Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 相同代码中的MATLAB速度差_Optimization_Matlab - Fatal编程技术网

Optimization 相同代码中的MATLAB速度差

Optimization 相同代码中的MATLAB速度差,optimization,matlab,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以完全相同的顺序运行完全相同的代码

我有一些一直在使用的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以完全相同的顺序运行完全相同的代码,为什么两者的执行时间会有如此大的差异?

如果没有一个可复制的示例,很难说发生了什么。不过我可以告诉你如何寻找自己

关闭并重新打开MATLAB,这样一切都是新鲜的。(或者至少关闭所有隐藏的;清除类;clc;) 如果在调用
A
B
C
之前调用
D
,您会得到相同的计时吗?如果您没有清除中间的变量,那么MATLAB将不得不在第二次执行更少的分配

如果计时相同,则需要使用探查器。(单击桌面->分析器)评测每个脚本,并记下哪些行比较慢。他们匹配吗?你能看到一些图案吗?您确定在这两种情况下都执行相同的代码吗


如果仍然没有明显的原因来解释时间的不同,那么也许Praetorian是对的,这就是深度JIT魔法。

我相信你有记忆问题。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可以检测此类操作并使用内部优化。
但是,我们无法知道它是否会发生,因此最好避免这种操作。

也许MATLAB JIT能够在D中更好地优化您的代码,因为它可以一次看到所有代码。如果将B变成函数而不是脚本,会发生什么?您如何记录执行时间?尝试
全部清除;tic,A;BCtoc
然后与
进行比较,全部清除;tic,D;toc
。总之,@Praetorian给出了一个似是而非的解释。另外,让我猜猜:你对内置函数的使用在这段代码中并不占主导地位,你大部分时间都花在解释器上,比如
for
循环等。这将使它成为与Matlab JIT不同的主要候选对象。。。。至于评测,如果真的是2秒对15秒,那么这里解释的“Ctrl-C”评测方法可能是个好主意:。。。基本上,在调用代码之前,如果出现错误,您可以
dbstop,然后在认为速度慢时,使用Ctrl-C中断。。。这样做几次会让你很好地知道所有的时间都花在了哪里;MATLAB可以在某些情况下检测就地操作,并对其进行优化,以避免生成不必要的副本。请看我的回答:谢谢你,阿姆罗。你有没有任何例子会一直被优化?你应该阅读我的答案中链接的Loren博客文章:我已经阅读了博客。看起来没有人,甚至连Loren自己都无法判断JIT优化是否会发生。这非常令人不安。