tidyverse / purrr

A functional programming toolkit for R

Home Page:https://purrr.tidyverse.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Deprecation in `map_chr()` is quite slow

mgirlich opened this issue · comments

Setting up the deprecation env takes roughly a third of the time in the following reprex. Using map_vec() is actually faster:

x <- as.list(letters)

for (i in 1:10e3) {
  purrr::map_chr(x, function(x) paste0(x, "a"))
}

bench::mark(
  map_chr = purrr::map_chr(x, function(x) paste0(x, "a")),
  map = purrr::map(x, function(x) paste0(x, "a")) |> 
    purrr::list_c(ptype = character()),
  map_vec = purrr::map_vec(x, function(x) paste0(x, "a"), .ptype = character())
)
#> # A tibble: 3 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 map_chr     181.5µs  190.5µs     4425.    5.77KB     12.4
#> 2 map          89.5µs   96.1µs     9057.    47.1KB     12.6
#> 3 map_vec     100.9µs  106.8µs     8268.   40.55KB     14.5

Created on 2023-07-05 with reprex v2.0.2

image

Ugh, that's a bummer.

Most of it is probably withr::defer()

The standalone-defer file was improved here:
r-lib/withr#221

But that hasn't made its way to CRAN yet (or to rlang, which uses the standalone file)

And we think the ultimate goal was to move defer() to rlang and rewrite in C, but we haven't had time for that yet either.

We could just use on.exit() here?