在R中是否有衡量函数执行时间的标准化方法?

显然我可以用系统。时间,然后取它们的差异,但我想知道是否有一些标准化的方法或功能(不想发明轮子)。


我似乎记得我曾经用过如下的东西:

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

当前回答

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纳秒。

其他回答

有几个答案提到取两个Sys.time()的差值。

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
end - start

这将以人类可读的格式打印结果,例如“2秒的时间差”。但是,由于单位可以变化(从“秒”到“分钟”到“天”),因此,如果多个运行时的单位不同,那么使用此方法在相同基础上比较它们就不太有用。

对于非交互目的,最好指定时间单位。

具体来说,Sys.time()返回一个POSIXct对象。取两个posixct的差值,给出一个difftime类的对象,该对象具有“units”属性。特别是' - '操作被定义为在与POSIXct一起使用时使用difftime()。也就是说,

time2 - time1

等于

difftime(time2, time1)

要指定units属性,添加一个units=参数,例如。

difftime(time2, time1, units="secs")

总而言之,可以使用Sys.time()用指定的单位(秒、分等)来测量运行时。

start <- Sys.time()
## ... code here ... ##
end <- Sys.time()
difftime(end, start, units="secs")
library(rbenchmark)

sleep_func <- function() { Sys.sleep(0.5) }

benchmark(sleep_func())

out:

 test replications elapsed relative user.self sys.self user.child sys.child

1 sleep_func()          100   50.08        1      0.02        0         NA        NA

包“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

虽然其他解决方案对于单个函数也很有用,但我推荐使用下面的代码段,因为它更通用、更有效:

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

另一种简单但非常强大的方法是使用包profvis。它不仅测量代码的执行时间,还为您提供了执行每个函数的钻取。它也可以用于Shiny。

library(profvis)

profvis({
  #your code here
})

点击这里查看一些例子。