在我的Matlab代码中搜索如何避免使用循环的想法,我在one question on SE下找到了以下注释:
由于Matlab ... euhm,R2008a?
和
您是否尝试过针对for循环与已有的循环进行基准测试?有时它比矢量化代码更快......
所以我想问一下,是否有常用的方法来测试Matlab中的进程速度?用户是否可以在某个地方看到流程需要多长时间,或者唯一的方法是将流程延长几分钟以便比较彼此之间的时间?
答案 0 :(得分:23)
测试MATLAB代码性能的最佳工具是Steve Eddins的timeit
函数,来自MATLAB Central File Exchange的available here。
它处理许多与为您量身定制MATLAB代码相关的细微问题,例如:
更新:从版本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还会清除下次的当前个人资料数据。
请记住,配置文件确实会降低执行速度,但我相信它会以统一的方式执行所有操作。
显然,如果你的功能非常快,你可能会发现你没有得到可靠的结果,所以如果你可以多次运行它或者扩展可以改善问题的计算。
如果您正在测试的内容非常简单,您还可以使用tic
和toc
来计算时间:
>> tic; % Start the timer
>> myfunctionname( );
>> toc; % End the timer and display elapsed time
此外,如果您需要多个计时器,您可以将它们分配给变量:
>> mytimer = tic;
>> myfunctionname( );
>> toc(mytimer);
最后,如果您想存储经过的时间而不是显示它:
>> myresult = toc;
答案 2 :(得分:5)
我认为我说得对,我们很多时候通过在tic
和toc
之间包含我们感兴趣的代码块来定时Matlab。此外,我们注意确保总时间大约为10秒(而不是1秒或100秒)并重复3到5次并采取一定程度的集中趋势(例如均值)并从中得出结论。
如果该段代码少于10秒,则根据需要重复多次以使其进入范围,小心避免一次迭代对下一次迭代的影响。如果代码自然需要100秒或更长时间,则要么在测试上花费更长时间,要么尝试使用人为的小输入数据来更快地运行。
根据我的经验,没有必要运行程序几分钟来获得平均运行时间的数据,并且方差可以接受。如果我运行一个程序5次,其中一个(或两个)结果与平均值大不相同,我将重新运行它。
当然,如果代码具有使其运行时间不确定的任何功能,那么这是另一回事。