r - 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 日创建
解决方案
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)
推荐阅读
- reactjs - TypeError:cartItems.find 不是函数
- javascript - Vue关闭后如何触发vuejs-datepicker
- .htaccess - htaccess - 在第一次加载时加载带有“www”的 url
- css - 如何使用 userChrome.css 设置 Firefox 的 URL 栏的背景颜色?
- matplotlib - 如何使用 matplotlib 绘制半圆弧/圆?
- wagtail - 鹡鸰管理表格订购
- php - 如何在不破坏下面的自定义字段的情况下让自定义帖子类型显示在存档页面上?
- excel - Windows 更新后的“运行时错误 '9'”下标超出范围”
- flutter - How can i swipe the elements in a grid view
- javascript - 为什么我的 Angular 前端(带有 AWS 负载均衡器的容器)API 调用没有到达我的 Nodejs 后端(带有 AWS LB 的容器)?