17

在寻找如何避免在我的 Matlab 代码中使用循环的想法时,我在 SE 的一个问题下发现了以下评论:

自从 Matlab...euhm,R2008a 以来,“for 循环在 Matlab 中很慢”的说法通常不再正确?

您是否尝试过对 for 循环与已有的循环进行基准测试?有时它比矢量化代码更快......

所以我想问一下,Matlab中是否有常用的方法来测试进程的速度?用户是否可以在某处看到该过程需要多少时间,或者唯一的方法是将过程延长几分钟以比较彼此之间的时间?

4

3 回答 3

23

测试 MATLAB 代码性能的最佳工具是 Steve Eddins 的timeit函数,从 MATLAB Central File Exchange 获得。

它为您处理与对 MATLAB 代码进行基准测试相关的许多微妙问题,例如:

  • 通过将基准代码包装在函数中来确保使用 JIT 编译
  • 预热代码
  • 多次运行代码并取平均值

更新:截至 R2013b 版本,timeit是核心 MATLAB 的一部分。


更新:从 R2016a 版本开始,MATLAB 还包括一个性能测试框架,它以与timeit.

于 2012-12-20T15:17:37.430 回答
13

您可以使用分析器来评估您的函数以及其中的代码块花费了多少时间。

>> profile on; % Starts the profiler
>> myfunctiontorun( ); % This can be a function, script or block of code
>> profile viewer; % Opens the viewer showing you how much time everything took

查看器还会清除当前配置文件数据以备下次使用。

请记住,配置文件确实会稍微减慢执行速度,但我相信它会以统一的方式在所有内容中执行。

显然,如果你的函数非常快,你可能会发现你没有得到可靠的结果,所以如果你可以多次运行它或扩展计算会改善问题。

如果您要测试的东西真的很简单,您也可以使用ticand来计时toc

>> tic; % Start the timer
>> myfunctionname( );
>> toc; % End the timer and display elapsed time

此外,如果您想要多个计时器,您可以将它们分配给变量:

>> mytimer = tic;
>> myfunctionname( );
>> toc(mytimer);

最后,如果您想存储经过的时间而不是显示它:

>> myresult = toc;
于 2012-12-20T14:05:54.283 回答
5

tic我认为我说我们中的许多人通过在和之间包装我们感兴趣的代码块来使用 Matlab 是正确的toc。此外,我们注意确保总时间约为 10 秒(而不是 1 秒或 100 秒)并重复 3 - 5 次,并采取一些集中趋势(例如平均值)并从中得出我们的结论。

如果一段代码花费的时间少于 10 秒,则根据需要重复多次以使其进入范围,小心避免一次迭代对下一次迭代产生任何影响。如果代码自然需要 100 秒或更长时间,要么在测试上花费更长的时间,要么尝试使用人为的小输入数据以更快地运行。

以我的经验,没有必要运行几分钟的程序来获得平均运行时间的数据,并且方差可以接受。如果我运行一个程序 5 次,其中一个(或两个)结果与我将重新运行它的平均值大不相同。

当然,如果代码具有使其运行时间不确定的任何特性,那就另当别论了。

于 2012-12-20T14:10:57.683 回答