首页 > 解决方案 > proc.time() 的更快替代方案?

问题描述

我维护了一个记录许多命令运行时的 R 包,我注意到由于proc.time(). 有更快的选择吗?我只需要根据经过的时间来衡量事物,而且我可以用低精度来衡量。

此示例工作流显示的开销proc.time()约为我机器上总运行时间的 14%。

在此处输入图像描述

为了确认我所看到的,我通过删除此行并用固定的过时时间戳替换此行来暂时消除大部分开销。

在此处输入图像描述

个人调用proc.time()本身非常快,但就我而言,它们加起来。

microbenchmark::microbenchmark(
  proc.time()
)
#> Unit: microseconds
#>         expr   min    lq    mean median    uq    max neval
#>  proc.time() 1.481 1.494 1.63657  1.501 1.546 11.744   100

reprex 包(v0.3.0)于 2019 年 11 月 22 日创建

会话信息

devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 3.6.1 (2019-07-05)
#>  os       macOS Mojave 10.14.6        
#>  system   x86_64, darwin15.6.0        
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/Indiana/Indianapolis
#>  date     2019-11-22                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package        * version    date       lib source                        
#>  assertthat       0.2.1      2019-03-21 [1] CRAN (R 3.6.0)                
#>  backports        1.1.5      2019-10-02 [1] CRAN (R 3.6.1)                
#>  callr            3.3.2      2019-09-22 [1] CRAN (R 3.6.0)                
#>  cli              1.9.9.9000 2019-11-19 [1] Github (r-lib/cli@24a9bd8)    
#>  crayon           1.3.4      2017-09-16 [1] CRAN (R 3.6.0)                
#>  desc             1.2.0      2019-08-19 [1] Github (r-lib/desc@c860e7b)   
#>  devtools         2.2.1      2019-09-24 [1] CRAN (R 3.6.0)                
#>  digest           0.6.22     2019-10-21 [1] CRAN (R 3.6.1)                
#>  ellipsis         0.3.0      2019-09-20 [1] CRAN (R 3.6.0)                
#>  evaluate         0.14       2019-05-28 [1] CRAN (R 3.6.0)                
#>  fansi            0.4.0      2018-10-05 [1] CRAN (R 3.6.0)                
#>  fs               1.3.1      2019-05-06 [1] CRAN (R 3.6.0)                
#>  glue             1.3.1      2019-03-12 [1] CRAN (R 3.6.0)                
#>  highr            0.8        2019-03-20 [1] CRAN (R 3.6.0)                
#>  hms              0.5.2      2019-10-30 [1] CRAN (R 3.6.0)                
#>  htmltools        0.4.0      2019-10-04 [1] CRAN (R 3.6.0)                
#>  knitr            1.26       2019-11-12 [1] CRAN (R 3.6.1)                
#>  magrittr         1.5        2014-11-22 [1] CRAN (R 3.6.0)                
#>  memoise          1.1.0      2017-04-21 [1] CRAN (R 3.6.0)                
#>  microbenchmark   1.4-7      2019-09-24 [1] CRAN (R 3.6.0)                
#>  pillar           1.4.2.9001 2019-08-19 [1] Github (r-lib/pillar@82370d7) 
#>  pkgbuild         1.0.6      2019-10-09 [1] CRAN (R 3.6.0)                
#>  pkgconfig        2.0.3      2019-09-22 [1] CRAN (R 3.6.1)                
#>  pkgload          1.0.2      2018-10-29 [1] CRAN (R 3.6.0)                
#>  prettyunits      1.0.2      2015-07-13 [1] CRAN (R 3.6.0)                
#>  processx         3.4.1      2019-07-18 [1] CRAN (R 3.6.0)                
#>  progress         1.2.2      2019-05-16 [1] CRAN (R 3.6.0)                
#>  ps               1.3.0      2018-12-21 [1] CRAN (R 3.6.0)                
#>  R6               2.4.1      2019-11-12 [1] CRAN (R 3.6.1)                
#>  Rcpp             1.0.3      2019-11-08 [1] CRAN (R 3.6.0)                
#>  remotes          2.1.0      2019-06-24 [1] CRAN (R 3.6.0)                
#>  rlang            0.4.1      2019-10-24 [1] CRAN (R 3.6.1)                
#>  rmarkdown        1.17       2019-11-13 [1] CRAN (R 3.6.0)                
#>  rprojroot        1.3-2      2018-01-03 [1] CRAN (R 3.6.0)                
#>  sessioninfo      1.1.1      2018-11-05 [1] CRAN (R 3.6.0)                
#>  stringi          1.4.3      2019-03-12 [1] CRAN (R 3.6.0)                
#>  stringr          1.4.0      2019-02-10 [1] CRAN (R 3.6.0)                
#>  testthat         2.3.0      2019-11-05 [1] CRAN (R 3.6.0)                
#>  tibble           2.1.3      2019-06-06 [1] CRAN (R 3.6.0)                
#>  usethis          1.5.1.9000 2019-08-12 [1] Github (r-lib/usethis@b241420)
#>  vctrs            0.2.0      2019-07-05 [1] CRAN (R 3.6.0)                
#>  withr            2.1.2      2018-03-15 [1] CRAN (R 3.6.0)                
#>  xfun             0.11       2019-11-12 [1] CRAN (R 3.6.1)                
#>  yaml             2.2.0      2018-07-25 [1] CRAN (R 3.6.0)                
#>  zeallot          0.1.0      2018-01-28 [1] CRAN (R 3.6.0)                
#> 
#> [1] /Library/Frameworks/R.framework/Versions/3.6/Resources/library

编辑:get_nanotime()

microbenchmark软件包有一个get_nanotime()功能,但它比proc.time()我的机器上慢。

microbenchmark::microbenchmark(
  microbenchmark::get_nanotime(),
  proc.time()
)
#> Unit: microseconds
#>                            expr   min     lq    mean median    uq    max neval
#>  microbenchmark::get_nanotime() 5.354 5.5925 6.17782 5.7895 5.937 43.305   100
#>                     proc.time() 1.490 1.5385 1.78394 1.7505 1.873  8.025   100

reprex 包(v0.3.0)于 2019 年 11 月 22 日创建

标签: r

解决方案


proc.time()base R 的功能有其他选择。两个具有相似功能的包是

  • microbenchmark,功能get_nanotime()
  • bench, 功能hires_time()

在对这个问题的评论中,OP 说它是

已确认:hires_time()在我尝试过的 Mac 和 Linux 机器上快了 10 倍以上。

下面的测试是在 Ubuntu 19.04 上使用 R 3.6.1 运行的,结果不是那么激烈,但是bench::hires_time是三者中最快的。

library(bench)
library(microbenchmark)

mb <- microbenchmark(
  microb = get_nanotime(),
  bench = hires_time(),
  Rbase = proc.time()
)
print(mb, order = 'median')
#Unit: microseconds
#   expr   min     lq    mean median     uq    max neval cld
#  bench 1.107 1.1690 2.03060 1.2320 1.2755 80.835   100   a
# microb 2.006 2.0435 2.46541 2.1200 2.1750 35.431   100   a
#  Rbase 2.517 2.6520 2.87621 2.7085 2.7840 16.246   100   a

ggplot2::autoplot(mb)

在此处输入图像描述


推荐阅读