Deprecation in `map_chr()` is quite slow
mgirlich opened this issue · 3 comments
mgirlich commented
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
hadley commented
Ugh, that's a bummer.
DavisVaughan commented
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.
hadley commented
We could just use on.exit()
here?