我想测量重复运行函数所需的时间。
replicate()
和使用 for 循环是否等效?例如:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
这是首选方法。
在 的输出中
system.time()
,是sys+user
运行程序的实际 CPU 时间吗?是否elapsed
可以很好地衡量程序的时间性能?
R中的计时功能
机器算法验证
r
2022-02-02 18:34:23
4个回答
关于你的两点:
- 这是风格。我喜欢
replicate()
它,因为它很实用。 - 我倾向于关注
elapsed
,即第三个数字。
我经常做的是
N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )
得到 N 次调用的 90% 的修剪平均值f()
。
(编辑,感谢哈德利抓住了一个想法。)
为了有效地安排程序,特别是当您对比较替代解决方案感兴趣时,您需要一个控制!一个好方法是将您正在计时的过程放入一个函数中。在计时循环中调用该函数。编写一个存根过程,本质上是从函数中删除所有代码并从中返回(但保留所有参数)。将存根放入计时循环并重新计时。这测量了与时序相关的所有开销。从程序时间中减去存根时间以获得网络:这应该是对实际所需时间的准确度量。
因为现在大多数系统都可以被强制中断,所以进行几次定时运行以检查可变性很重要。而不是长期运行秒,做大约运行每个秒。它有助于一次性完成双循环。这不仅更容易处理,而且在每个时间序列中引入了一点负相关,这实际上提高了估计值。
通过使用这些实验设计的基本原则,您基本上可以控制由于您如何部署代码而产生的任何差异(例如,for 循环和replicate() 之间的差异)。这会让你的问题消失。
您还可以使用返回的时间步来计时Sys.time
;这当然测量壁时间,所以实时计算时间。示例代码:
Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);
关于使用哪个计时指标,我无法添加到其他响应者。
关于要使用的功能,我喜欢使用rbenchmark 包中的 ?benchmark 。