Skip to content

Instantly share code, notes, and snippets.

@njtierney
Created July 7, 2025 06:33
Show Gist options
  • Select an option

  • Save njtierney/50bf98011d66453324beeb1bf0ff2b30 to your computer and use it in GitHub Desktop.

Select an option

Save njtierney/50bf98011d66453324beeb1bf0ff2b30 to your computer and use it in GitHub Desktop.
n_times <- 2
create_vec <- function(n_times) rep(as.character(1:4), each = n_times)
example_vec <- create_vec(n_times)


example_vec
#> [1] "1" "1" "2" "2" "3" "3" "4" "4"
example_lookup <- as.character(c(2, 4, 1, 3)) |> 
  setNames(1:4)

example_lookup
#>   1   2   3   4 
#> "2" "4" "1" "3"

example_vec2 <- dplyr::case_when(
      example_vec == "1" ~ "2", # paper yes (1) = Online yes (2)
      example_vec == "2" ~ "4", # paper unsure (2) = Online unsure (4)
      example_vec == "3" ~ "1", # paper no (3) = Online no (1)
      example_vec == "4" ~ "3", # paper don't have (4) = online don't have (3)
      .default = example_vec
    )

example_vec2
#> [1] "2" "2" "4" "4" "1" "1" "3" "3"

example_lookup[example_vec]
#>   1   1   2   2   3   3   4   4 
#> "2" "2" "4" "4" "1" "1" "3" "3"
unname(example_lookup[example_vec])
#> [1] "2" "2" "4" "4" "1" "1" "3" "3"

bm <- bench::mark(
  case = dplyr::case_when(
      example_vec == "1" ~ "2", # paper yes (1) = Online yes (2)
      example_vec == "2" ~ "4", # paper unsure (2) = Online unsure (4)
      example_vec == "3" ~ "1", # paper no (3) = Online no (1)
      example_vec == "4" ~ "3", # paper don't have (4) = online don't have (3)
      .default = example_vec
    ),
  lookup = unname(example_lookup[example_vec])
)

bm
#> # A tibble: 2 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 case         85.5µs   90.1µs    10968.     1.3KB     43.9
#> 2 lookup        615ns  778.9ns  1279803.        0B      0
summary(bm, relative = TRUE)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 case        139.   116.        1        Inf      Inf
#> 2 lookup        1      1       117.       NaN      NaN

# comparing over N size
bp <- bench::press(
  n_times = c(2, 20, 200, 2000, 20000, 200000),
  {
    dat <- create_vec(n_times)
    bench::mark(
      case = dplyr::case_when(
      dat == "1" ~ "2", # paper yes (1) = Online yes (2)
      dat == "2" ~ "4", # paper unsure (2) = Online unsure (4)
      dat == "3" ~ "1", # paper no (3) = Online no (1)
      dat == "4" ~ "3", # paper don't have (4) = online don't have (3)
      .default = dat
    ),
  lookup = unname(example_lookup[dat])
    )
  }
)
#> Running with:
#>   n_times
#> 1       2
#> 2      20
#> 3     200
#> 4    2000
#> 5   20000
#> 6  200000
#> Warning: Some expressions had a GC in every iteration; so filtering is
#> disabled.

library(bench)
bp
#> # A tibble: 12 × 7
#>    expression n_times      min   median `itr/sec` mem_alloc `gc/sec`
#>    <bch:expr>   <dbl> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#>  1 case             2  88.81µs  93.69µs    9911.      1.3KB     46.3
#>  2 lookup           2    656ns 778.93ns 1268942.         0B    127. 
#>  3 case            20  91.72µs  98.44µs   10084.    10.18KB     48.7
#>  4 lookup          20   1.68µs   1.93µs  483353.     2.38KB      0  
#>  5 case           200 117.75µs 124.46µs    7911.    83.81KB     38.5
#>  6 lookup         200  11.07µs  12.79µs   78010.    22.06KB     31.2
#>  7 case          2000 349.24µs 384.64µs    2581.   815.05KB     42.7
#>  8 lookup        2000 103.32µs 119.72µs    8367.   218.94KB     36.5
#>  9 case         20000   2.76ms   3.06ms     303.     7.94MB    104. 
#> 10 lookup       20000   1.03ms    1.2ms     831.     2.14MB     40.2
#> 11 case        200000  33.76ms     35ms      24.9   79.35MB     51.8
#> 12 lookup      200000  11.61ms  13.55ms      75.3   21.36MB     39.6
plot(bp)

summary(bp, relative = TRUE)
#> Warning: Some expressions had a GC in every iteration; so filtering is
#> disabled.
#> # A tibble: 12 × 7
#>    expression n_times      min   median `itr/sec` mem_alloc `gc/sec`
#>    <bch:expr>   <dbl>    <dbl>    <dbl>     <dbl>     <dbl>    <dbl>
#>  1 case             2   135.     120.      379.         Inf      Inf
#>  2 lookup           2     1        1     46807.         NaN      Inf
#>  3 case            20   140.     126.      384.         Inf      Inf
#>  4 lookup          20     2.56     2.47  19379.         Inf      NaN
#>  5 case           200   180.     160.      298.         Inf      Inf
#>  6 lookup         200    16.9     16.4    2897.         Inf      Inf
#>  7 case          2000   532.     494.       93.6        Inf      Inf
#>  8 lookup        2000   157.     154.      314.         Inf      Inf
#>  9 case         20000  4214.    3996.       10.9        Inf      Inf
#> 10 lookup       20000  1578.    1539.       31.2        Inf      Inf
#> 11 case        200000 51458.   44929.        1          Inf      Inf
#> 12 lookup      200000 17700.   17394.        3.02       Inf      Inf

Created on 2025-07-07 with reprex v2.1.1

Session info

sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.5.1 (2025-06-13)
#>  os       macOS Sonoma 14.5
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_AU.UTF-8
#>  ctype    en_AU.UTF-8
#>  tz       Australia/Hobart
#>  date     2025-07-07
#>  pandoc   3.6.3 @ /Applications/Positron.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
#>  quarto   1.7.31 @ /usr/local/bin/quarto
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package      * version    date (UTC) lib source
#>  beeswarm       0.4.0      2021-06-01 [1] CRAN (R 4.5.0)
#>  bench        * 1.1.4      2025-01-16 [1] CRAN (R 4.5.0)
#>  cli            3.6.5      2025-04-23 [1] CRAN (R 4.5.0)
#>  curl           6.2.2      2025-03-24 [1] CRAN (R 4.5.0)
#>  digest         0.6.37     2024-08-19 [1] CRAN (R 4.5.0)
#>  dplyr          1.1.4      2023-11-17 [1] CRAN (R 4.5.0)
#>  evaluate       1.0.4      2025-06-18 [1] CRAN (R 4.5.0)
#>  farver         2.1.2      2024-05-13 [1] CRAN (R 4.5.0)
#>  fastmap        1.2.0      2024-05-15 [1] CRAN (R 4.5.0)
#>  fs             1.6.6      2025-04-12 [1] CRAN (R 4.5.0)
#>  generics       0.1.4      2025-05-09 [1] CRAN (R 4.5.0)
#>  ggbeeswarm     0.7.2      2023-04-29 [1] CRAN (R 4.5.0)
#>  ggplot2        3.5.2      2025-04-09 [1] CRAN (R 4.5.0)
#>  glue           1.8.0      2024-09-30 [1] CRAN (R 4.5.0)
#>  gtable         0.3.6      2024-10-25 [1] CRAN (R 4.5.0)
#>  htmltools      0.5.8.1    2024-04-04 [1] CRAN (R 4.5.0)
#>  knitr          1.50       2025-03-16 [1] CRAN (R 4.5.0)
#>  lifecycle      1.0.4      2023-11-07 [1] CRAN (R 4.5.0)
#>  magrittr       2.0.3      2022-03-30 [1] CRAN (R 4.5.0)
#>  pillar         1.10.2     2025-04-05 [1] CRAN (R 4.5.0)
#>  pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.5.0)
#>  profmem        0.6.0      2020-12-13 [1] CRAN (R 4.5.0)
#>  purrr          1.0.4.9000 2025-05-04 [1] Github (tidyverse/purrr@9c8beb4)
#>  R6             2.6.1      2025-02-15 [1] CRAN (R 4.5.0)
#>  RColorBrewer   1.1-3      2022-04-03 [1] CRAN (R 4.5.0)
#>  reprex         2.1.1      2024-07-06 [1] CRAN (R 4.5.0)
#>  rlang          1.1.6      2025-04-11 [1] CRAN (R 4.5.0)
#>  rmarkdown      2.29       2024-11-04 [1] CRAN (R 4.5.0)
#>  scales         1.4.0      2025-04-24 [1] CRAN (R 4.5.0)
#>  sessioninfo    1.2.3      2025-02-05 [1] CRAN (R 4.5.0)
#>  tibble         3.3.0      2025-06-08 [1] CRAN (R 4.5.0)
#>  tidyr          1.3.1      2024-01-24 [1] CRAN (R 4.5.0)
#>  tidyselect     1.2.1      2024-03-11 [1] CRAN (R 4.5.0)
#>  utf8           1.2.6      2025-06-08 [1] CRAN (R 4.5.0)
#>  vctrs          0.6.5      2023-12-01 [1] CRAN (R 4.5.0)
#>  vipor          0.4.7      2023-12-18 [1] CRAN (R 4.5.0)
#>  withr          3.0.2      2024-10-28 [1] CRAN (R 4.5.0)
#>  xfun           0.52       2025-04-02 [1] CRAN (R 4.5.0)
#>  xml2           1.3.8      2025-03-14 [1] CRAN (R 4.5.0)
#>  yaml           2.3.10     2024-07-26 [1] CRAN (R 4.5.0)
#> 
#>  [1] /Users/nick_1/Library/R/arm64/4.5/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment