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

时间:2012-12-20 14:01:57

标签: performance matlab loops vectorization

在我的Matlab代码中搜索如何避免使用循环的想法,我在one question on SE下找到了以下注释:

  

由于Matlab ... euhm,R2008a?

  

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

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

3 个答案:

答案 0 :(得分:23)

测试MATLAB代码性能的最佳工具是Steve Eddins的timeit函数,来自MATLAB Central File Exchange的available here

它处理许多与为您量身定制MATLAB代码相关的细微问题,例如:

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

更新:从版本R2013b开始,timeit是核心MATLAB的一部分。


更新:自版本R2016a起,MATLAB还包含一个performance testing framework,它以与timeit类似的方式为您处理上述问题。

答案 1 :(得分: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

Viewer还会清除下次的当前个人资料数据。

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

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

如果您正在测试的内容非常简单,您还可以使用tictoc来计算时间:

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

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

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

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

>> myresult = toc;

答案 2 :(得分:5)

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

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

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

当然,如果代码具有使其运行时间不确定的任何功能,那么这是另一回事。