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

Posted

技术标签:

【中文标题】如何对 Matlab 流程进行基准测试?【英文标题】:How to benchmark Matlab processes? 【发布时间】:2012-12-20 14:01:56 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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


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

【讨论】:

+1 表示我还不知道的一种方法,这似乎是经过深思熟虑的。 "averaging" 这个词在 timeit 使用中位数时最容易产生误导,而且似乎无法影响中位数,也无法更改运行次数。你知道是否有可能以某种方式获得运行时间的标准偏差?在一定水平下进行测量直到 SD 是有用的。 @hhh 我不确定这个词有什么误导性 - 中位数是平均值。无论如何 - 如果您愿意,修改timeit 的功能非常容易(我在这里指的是文件交换版本而不是更新的内置版本,但我希望它们是相似的)。只需键入edit timeit 即可查看函数的内部结构,您会看到它多次执行该函数,然后对它们调用median。只需修改timeit 以输出各个时间,您可以采用任何形式的平均值或标准差。【参考方案2】:

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

>> 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;

【讨论】:

探查器不会以一定统一的方式减慢执行速度。它会禁用 JIT 编译器,这会对不同的代码片段产生截然不同的影响。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于如何对 Matlab 流程进行基准测试?的主要内容,如果未能解决你的问题,请参考以下文章

什么是mysql基准测试

什么是mysql基准测试

如何在 Spark 控制台中对性能进行基准测试?

如何在 Clojure 中对函数进行基准测试?

如何对你的Python代码进行基准测试

创新技术实践 | MySQL基准测试实践