【问题标题】:timing code in matlabmatlab中的计时码
【发布时间】:2013-09-23 05:53:59
【问题描述】:

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

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

tic
%//function 1
toc

tic
%//function 2
toc

tic
%//function 3
toc

tic
%//function 4
toc

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

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

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

我还咨询了以下网站:Timing code in MATLABProfiler to find code bottlenecks

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

【问题讨论】:

  • 如果您担心(短)过程会干扰您的测量结果。一般来说,查看时间的中位数而不是平均值是一个好主意。
  • 我已经撤消了您上次的编辑,我认为它混淆了本次问答的重点,否则非常好。关于该编辑中的问题(以防它仍然有用):imfilter 尽可能分离内核(您可以edit 它查看代码),并且可能conv2 也这样做,不确定。无论如何,这里的执行时间似乎由图像加载时间决定,您应该将其排除在计时之外。

标签: performance matlab timer


【解决方案1】:

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

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

如果不充分了解 MATLAB 的底层工作原理,这些事情就很难做好,timeit 会为您处理这些事情 - tictoc 的简单应用程序不会。

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

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

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

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

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

【讨论】:

  • PS 我刚刚浏览了您的编辑,其中包含 onetwo 等函数。如果以后,当您实际要使用这些函数时,您将需要一些他们的输出,你真的应该为他们返回输出参数计时。
  • 我所有的函数都返回相同的输出。那么是否有必要通过返回输出来计时我的函数?然后他们会表现出差异吗?
  • 如果它们都返回相同的输出参数,那么它可能不会显着影响相对时间 - 它应该对每个都有相同的影响。但总的来说,尽量按照实际使用的方式来安排时间,因为哪些事情会成为瓶颈并不明显。
  • +1: :))谢谢我接受了你的回答。顺便说一句,你能告诉我如何在 matlab 中以更快的方法计算 2D 图像的梯度吗?据我了解,matlab 的梯度命令效率很低。我实际上在这里找到了它:regularize.wordpress.com/2013/06/19/…
  • @roni,请在单独的问题中提出,我们会尝试。
【解决方案2】:

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

t(i) = toc

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

【讨论】:

  • 它分析的不仅仅是简单的时间流逝,而且已经评估了确定的时间跨度。但也许您不需要任何进一步的计算,因为分析器提供了您需要的所有信息。试试看;)
  • 分析器会减慢你的代码,因为(为了逐行计时,并提供它给你的其他诊断信息),它需要关闭 JIT 编译器的各个方面。
  • @roni 只需考虑分析器为您提供上限。如果一条线很慢,您总是可以使用分析器发现它,但有时事情似乎很慢,如果没有分析器运行它实际上可以加速。 --- 对于它的价值,虽然正常运行和开启分析器之间可能存在差异,但分析器总是把我带到正确的瓶颈。
  • @roni 当然。像这样想。在非常旧的 MATLAB 版本中,MATLAB 纯粹是一种解释性语言,换句话说,它一次执行一行代码,然后移动到下一行。在较新的版本中,它会在运行时查看您的代码,并预编译其中的一些部分,以便它们运行得更快。这称为即时编译或 JIT 编译。当您使用分析器时,为了生成它的报告,它需要逐行提供信息,因此它需要关闭一些这种 JIT 功能。 (续...)
  • @roni (...) 您的代码因此运行速度较慢。它不仅运行速度较慢,而且不同的事物会比其他事物更慢,因此这不是比较两个不同事物的好方法。
【解决方案3】:

使用分析器几乎和 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 文档了解如何更改。

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

【讨论】:

  • 分析器的一个主要问题是它关闭了 JIT 加速器。
  • @DanielE.Shub 是的,谢谢!山姆还在他的帖子中向我解释过!所以 timeit 更好还是 tic-toc ?并就 etime 下达命令?
  • @roni 您不需要etime 进行计时。充其量它可以为您提供与tictoc 相同的结果。通常tictoc 用于快速和脏检查,而timeit 可以提供更好的结果。但是,如果您有很多行并且想快速查看哪些行需要很长时间,您可以使用分析器。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
相关资源
最近更新 更多