R中的计时功能

机器算法验证 r
2022-02-02 18:34:23
  1. 我想测量重复运行函数所需的时间。replicate()和使用 for 循环是否等效?例如:

    system.time(replicate(1000, f()));
    system.time(for(i in 1:1000){f()});
    

    这是首选方法。

  2. 在 的输出中system.time(),是sys+user运行程序的实际 CPU 时间吗?是否elapsed可以很好地衡量程序的时间性能?

4个回答

关于你的两点:

  1. 这是风格。我喜欢replicate()它,因为它很实用。
  2. 我倾向于关注elapsed,即第三个数字。

我经常做的是

N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )

得到 N 次调用的 90% 的修剪平均值f()

(编辑,感谢哈德利抓住了一个想法。)

为了有效地安排程序,特别是当您对比较​​替代解决方案感兴趣时,您需要一个控制!一个好方法是将您正在计时的过程放入一个函数中。在计时循环中调用该函数。编写一个存根过程,本质上是从函数中删除所有代码并从中返回(但保留所有参数)。将存根放入计时循环并重新计时。这测量了与时序相关的所有开销。从程序时间中减去存根时间以获得网络:这应该是对实际所需时间的准确度量。

因为现在大多数系统都可以被强制中断,所以进行几次定时运行以检查可变性很重要。而不是长期运行N秒,做m大约运行N/m每个秒。它有助于一次性完成双循环。这不仅更容易处理,而且在每个时间序列中引入了一点负相关,这实际上提高了估计值。

通过使用这些实验设计的基本原则,您基本上可以控制由于您如何部署代码而产生的任何差异(例如,for 循环和replicate() 之间的差异)。这会让你的问题消失。

您还可以使用返回的时间步来计时Sys.time这当然测量壁时间,所以实时计算时间。示例代码:

Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);

关于使用哪个计时指标,我无法添加到其他响应者。

关于要使用的功能,我喜欢使用rbenchmark 包中的 ?benchmark 。