如何对Matlab进程进行基准测试?

Mas*_*rPJ 17 performance matlab loops vectorization

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

自从Matlab ... euhm,R2008a以来,声明"for循环在Matlab中很慢"的说法已不再正确.

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

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

Sam*_*rts 23

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

它处理许多与为您标记MATLAB代码相关的微妙问题,例如:

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

更新:截至发布R2013b,timeit是核心MATLAB的一部分.


更新:从版本R2016a开始,MATLAB还包括一个性能测试框架,以类似的方式为您处理上述问题timeit.

  • 对于我还不知道的方法+1,这似乎是经过深思熟虑的. (2认同)

n00*_*dle 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
Run Code Online (Sandbox Code Playgroud)

Viewer还会清除下次的当前配置文件数据.

请记住,配置文件确实会降低执行速度,但我相信它会以统一的方式实现所有功能.

显然,如果你的功能很快,你可能会发现你没有得到可靠的结果,所以如果你可以多次运行它或扩展计算,这将改善问题.

如果它是你正在测试很简单的东西,你也可以只使用Time它tictoc:

>> tic; % Start the timer
>> myfunctionname( );
>> toc; % End the timer and display elapsed time
Run Code Online (Sandbox Code Playgroud)

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

>> mytimer = tic;
>> myfunctionname( );
>> toc(mytimer);
Run Code Online (Sandbox Code Playgroud)

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

>> myresult = toc;
Run Code Online (Sandbox Code Playgroud)

  • 分析器不会以必须统一的方式减慢执行速度.它禁用JIT编译器,它可以对不同的代码片段产生非常不同的影响. (4认同)

Hig*_*ark 5

我认为我是对通过包装的代码我们感兴趣的块地指出,我们很多的时间Matlab的tictoc.此外,我们注意确保总时间为10秒(而不是1秒或100秒)并重复3到5次并采取一定程度的集中趋势(例如均值)并从中得出我们的结论.

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

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

当然,如果代码具有使其运行时间不确定的任何特征,那么它就是另一回事.