在R中测量功能执行时间


281

R中测量功能执行时间的方法是否标准化?

显然,我可以system.time在执行之前和执行之后进行处理,然后加以区别,但是我想知道是否存在某种标准化的方式或功能(想不发明轮子)。


我似乎记得我曾经使用过以下方法:

somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00  # output of somesysfunction
> "Result" "of" "myfunction"        # output of myfunction
> End time : 2001-01-01 00:00:10    # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction

2
我认为您proc.time心目中的原因system.time是您需要的。
Marek

1
对于较大的功能,Rprof很好。它提供了代码块/功能中所有进程的配置文件。
Rich Scriven

38
新的R用户通过google找到了这个问题require(microbenchmark):(从几年前开始)现在是计时事情的社区标准方法。times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark)。这将对超过1000次尝试进行统计比较,而不是仅测试一次。lmglmsystem.time
同构

使用res <- microbenchmark(your code1,your code2),然后再print(res)查看表格或ggplot2::autoplot(res)箱形图!裁判
特拉维斯

Answers:


253

另一种可能的方式是使用Sys.time():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

与上面的回答相比,这不是最优雅的方法,但绝对是一种方法。


14
这比system.time()效率更高,后者可以有效地复制其参数。当您处理几乎不适合RAM的数据时,这一点很重要。
亚当·里奇科夫斯基

2
对于使用的人Sys.time,请阅读以下警告:使用Sys.time()
李哲源

1
system.time()对我来说更快。我认为system.time()应该接受答案!
Gwang-Jin Kim,

这是我最好的方法,它可以知道在多个内核上并行执行长时间计算所花费的时间。在这种情况下,通过此调用测量的挂钟时间足够准确,因为计算机在处理所有内核时比进行其他任何事情都要忙得多,并且计算需要几分钟或几小时才能完成。这是一个非常具体的用例,但值得一提。
Pablo Adames

185

内置功能system.time()可以做到这一点。

使用方式如下: system.time(result <- myfunction(with, arguments))


1
重要的是要知道的是,system.time()有一个参数gcFirstTRUE默认。一方面,这使测量更具可重复性,但会产生总运行时间的大量开销(偏离时间未测量)。
jakob-r

2
用什么单位测量?例如,我刚运行system.time(result <- myfunction(with, arguments))并获得187.564的输出-以秒为单位还是什么?
zsad512

对于使用的人system.time,请阅读以下内容,以告诫:使用system.time()计时R代码时,“找不到对象”和“意外符号”错误
李哲源

@ zsad512我有把握地确定那是
塔珀


37

衡量执行时间的一种更好的方法是使用rbenchmark软件包。该软件包(轻松地)使您可以指定复制测试次数以及相对基准应该是多少次。

另请参阅stats.stackexchange中的相关问题


6
微基准测试甚至更好,因为它使用了更高精度的计时功能。
哈德利2011年

4
@hadley但是,在进行比较的情况下,rbenchmark更加用户友好。对我来说,microbenchmark是升级的system.time。rmicrobenchmark是我们所需要的:)
Marek

3
microbenchmark的维护者反应灵敏-我敢打赌他会添加您需要的任何内容。
哈德利2011年

34

microbenchmark 是一种轻量级(〜50kB)的程序包,在R中或多或少是一种标准方法,用于对多个表达式和函数进行基准测试:

microbenchmark(myfunction(with,arguments))

例如:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

在这里,两个表达式均被评估了10000次,平均执行时间约为25-30 ns。


32

也有 proc.time()

您可以按照与相同的方式使用,Sys.time但结果与相似system.time

ptm <- proc.time()
#your function here
proc.time() - ptm

使用之间的主要区别

system.time({ #your function here })

是该proc.time()方法仍然可以执行您的功能,而不仅仅是测量时间...顺便说一句,我喜欢在内部使用system.time{}因此您可以放置​​一些东西...


25

软件包“ tictoc”为您提供了一种测量执行时间的非常简单的方法。该文档位于:https : //cran.fhcrc.org/web/packages/tictoc/tictoc.pdf

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

要将经过的时间保存到变量中,可以执行以下操作:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic

18

尽管其他解决方案对于单个功能很有用,但我还是建议以下代码更通用,更有效:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))

2
直到现在我还不了解Rprof,它的确很棒!再加上它带有R基座,因此不需要额外的包as microbenchmarkprofvis
Simon C.

我想知道rprof是否也可以可视化,例如,例如,是否要绘制它分析的每个项目的时间?
Zawir Amin

@ZawirAmin有一种方法,只需使用Rstudio >>配置文件菜单
TPArrow,

13

另一种简单但功能强大的方法是使用包profvis。它不仅可以测量代码的执行时间,还可以深入了解您执行的每个函数。它也可以用于Shiny。

library(profvis)

profvis({
  #your code here
})

单击此处获取一些示例。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.