【问题标题】:MATLAB Speed Difference in Identical Code相同代码中的 MATLAB 速度差异
【发布时间】:2011-07-21 23:02:36
【问题描述】:

我有一些我一直在使用的 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 JIT 能够更好地优化 D 中的代码,因为它可以一次看到所有代码。
  • 如果将 B 变成函数而不是脚本会怎样?
  • 你是如何记录执行时间的?尝试clear all;tic,A;B;C;toc,然后与clear all;tic,D;toc 进行比较。无论如何,@Praetorian 给出了一个合理的解释..
  • 另外,让我猜一下:您对内置函数的使用在这段代码中并不占主导地位,而且您大部分时间都花在解释器上,比如for 循环等。这将使其成为与 Matlab JIT 差异的主要候选者。

标签: optimization matlab


【解决方案1】:

我相信你有记忆问题。 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 在某些情况下可以检测就地操作,并对其进行优化以避免进行不必要的复制。在这里查看我的答案:stackoverflow.com/questions/7228613/…
  • 感谢 Amro。你有什么总是会被优化的例子吗?
  • 你应该阅读我的回答中链接的 Loren 博客文章:blogs.mathworks.com/loren/2007/03/22/…
  • 我已阅读该博客。看起来没有人,甚至 Loren 自己都知道 JIT 优化是否会发生。这非常令人不安。
【解决方案2】:

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

关闭并重新打开 MATLAB,一切都是新鲜的。 (或者至少做close all hidden; clear classes; clc;。) 如果您在拨打ABC 之前先拨打D,您会得到相同的时间吗?如果您没有清除中间的变量,那么 MATLAB 将不得不在第二次进行较少的分配。

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

如果时间不同的原因仍然没有明显的原因,那么也许 Praetorian 是正确的,它是 JIT 的深层魔法。

【讨论】:

  • ... 至于分析,如果真的是 2 vs 15 秒,那么这里解释的“Ctrl-C”分析方法可能是一个好主意:stackoverflow.com/questions/375913/… ...基本上你@ 987654327@ 在调用你的代码之前,然后当你认为它很慢时用 Ctrl-C 中断......这样做几次会让你知道所有时间都花在了哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多