6

我用 4 种不同的方式写下了一个函数,我想给它计时。

到目前为止,我一直在做这件事:

tic
%//function 1
toc

tic
%//function 2
toc

tic
%//function 3
toc

tic
%//function 4
toc

但现在我想计算每个函数的时间数据(比如 100 次),然后计算每个函数花费的平均时间。我该怎么做?

我还在某处读到,打印的时间是经过的“挂钟”时间——所以它会受到我的计算机在 MATLAB 程序运行时所做的任何其他事情的影响。

那么有没有更好的方法呢??我听说有一个带有“profile on”命令的内置代码分析器的 MATLAB。请任何人都可以建议我使用它的方式吗?

我还查阅了以下站点:在 MATLABProfiler 中计时代码以查找代码瓶颈

请建议如何在循环中多次执行此操作。提前致谢。

4

3 回答 3

16

对 MATLAB 代码进行计时的最佳方法是使用timeit,可从 MATLAB Central File Exchange 获得。

它由 MathWorks 的高级开发人员之一 Steve Eddins 实现,它在您的代码计时中处理了许多微妙之处。例如,当代码在函数中而不是在脚本中执行时,代码的运行方式非常不同,并且需要进行几次“热身”运行才能充分利用 JIT 编译器。它还会在一个循环中多次运行代码,并取中位数。

如果不充分了解 MATLAB 如何在后台工作,并且timeit为您处理这些事情 - 简单的应用程序tictoc不应用程序,这些事情就很难做好。

正如其他答案所建议的那样,使用分析器是有问题的,因为它会关闭 JIT 编译器的许多方面,并且不会以正常的速度运行。Profiler 可以很好地告诉您代码的哪些部分花费了相对较大比例的时间,即发现瓶颈,但它并不是为了给您实际的时间安排。

请注意,在最新版本 (R2013b) 中,timeit它作为核心 MATLAB 的一部分提供,无需从 File Exchange 获取。

例如,要使用等于 64one的输入参数对函数计时,您可以键入:x

myfun = @()one(64);
timeit(myfun);

它的作用是为你的函数创建一个函数句柄one(确保代码在函数内部执行,如上所述很重要),然后将此函数句柄传递给timeit. 输出是timeit对执行代码所用时间的估计。

于 2013-09-23T09:08:27.477 回答
3

探查器是一种可能性,但它会显着减慢您的代码速度。或者,您可以将toc值存储在循环中或每次函数调用之后。

t(i) = toc

然后比较这些值,计算平均值或其他值,就像处理其他向量一样。

于 2013-09-23T07:39:33.840 回答
1

使用分析器几乎和 tic/toc 一样简单:

profile on;
for i=1:N
    your_function()
end
profile viewer;

如果您的 4 个功能是独立的并且不相互影响,您还可以在一个块中对所有功能进行分析:

profile on;
for i=1:N
    your_function1()
    your_function2()
    your_function3()
    your_function4()
end
profile viewer;

分析器将让您查看每一行代码的处理时间。您可以对挂钟或 cpu-time 进行基准测试,默认为 cpu-time。请参阅profile文档以了解如何更改它。

编辑:我喜欢分析器的一点是,它可以为您提供每个子功能的处理时间的细分 - 因此这是发现较大流程中的瓶颈的好方法。这可能不是这里的用例。

于 2013-09-23T07:04:26.397 回答