在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
包“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
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纳秒。
基于bench package网站:
bench::mark() from package bench is used to benchmark one or a series of expressions, we feel it has a number of advantages over alternatives.
Always uses the highest precision APIs available for each operating system (often nanoseconds).
Tracks memory allocations for each expression.
Tracks the number and type of R garbage collections per expression iteration.
Verifies equality of expression results by default, to avoid accidentally benchmarking inequivalent code.
Has bench::press(), which allows you to easily perform and combine benchmarks across a large grid of values.
Uses adaptive stopping by default, running each expression for a set amount of time rather than for a specific number of iterations.
Expressions are run in batches and summary statistics are calculated after filtering out iterations with garbage collections. This allows you to isolate the performance and effects of garbage collection on running time (for more details see Neal 2014).
The times and memory usage are returned as custom objects which have human readable formatting for display (e.g. 104ns) and comparisons (e.g. x$mem_alloc > "10MB").
There is also full support for plotting with ggplot2 including custom scales and formatting.
Use:
bench::mark(log10(5))
#> # A tibble: 1 × 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 log10(5) 212ns 274ns 2334086. 0B 0
由reprex包在2021-08-18创建(v2.0.1)
有几个答案提到取两个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")