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

17

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

自从Matlab...嗯,R2008a以来,“for循环在Matlab中速度很慢”这一说法不再普遍适用。

你是否尝试过对比已有的向量化代码和for循环?有时候for循环会更快...

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

3个回答

23

测试MATLAB代码性能的最佳工具是Steve Eddins的timeit函数,可以从MATLAB Central文件交换处下载

它可以为你处理与MATLAB代码基准测试相关的许多微妙问题,例如:

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

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


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


2
+1 对于我之前不知道但看起来设计得很好的方法。 - Thilo
1
“averaging”这个词在timeit使用中最好不要用,因为它使用的是中位数,而且似乎没有办法影响中位数,也没有办法改变运行次数。你知道是否有可能以某种方式获得运行时间的标准差吗?在某个水平下进行测量直到SD将会非常有用。 - hhh
@hhh 我不确定这个词有什么误导之处——中位数就是一种平均值。无论如何,如果你想要修改 timeit 的功能也很容易(我指的是文件交换版而非新版本内置版,但是它们应该很相似)。只需要输入 edit timeit 查看函数的内部,你会看到它对函数进行多次运行,然后调用 median 函数。只需修改 timeit 以输出每个时间,你就可以采取任何形式的平均值或标准差了。 - Sam Roberts

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

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

请记住,配置文件可能会使执行速度变慢一些,但我相信它会在所有方面以统一的方式做到这一点。

显然,如果您的函数非常快,您可能会发现无法获得可靠的结果,因此如果您可以多次运行它或扩展计算,那么将改善情况。

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

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

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

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

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

>> myresult = toc;

4
分析器不一定会以统一的方式减慢执行速度。它会禁用 JIT 编译器,这可能对不同代码段产生非常不同的影响。 - Sam Roberts

5
我认为,我们大多数人在Matlab中使用tictoc将我们感兴趣的代码块包装起来。此外,我们会注意确保总时间是几十秒的数量级(而不是1秒或100秒),并重复3-5次,并采取某些中心趋势度量(如平均值)并从中得出结论。
如果代码片段需要的时间少于10秒,则重复执行它直到其进入该范围,同时小心地避免一个迭代对下一个迭代产生影响。如果代码自然需要花费100秒或更长时间,则要么花更长时间进行测试,要么尝试使用人工缩小的输入数据运行以获得更快的速度。
在我的经验中,不必运行程序数分钟才能获得具有可接受低方差的平均运行时间的数据。如果我运行程序5次,其中一个(或两个)结果与平均值大相径庭,我会重新运行它。
当然,如果代码具有使其运行时间非确定性的特征,则情况就不同了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接