Skip to contents

Since tidyhydro uses C++ under the hood, it performs slightly faster than similar R packages (like hydroGOF). The results are particularly noticeable in large datasets with \(N\) observations exceeding 1000.

Below are benchmarking results ran during CI process. See machine specs below.

Default dataset avacha

# NSE
bench::mark(
  tidyhydro = tidyhydro::nse_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::NSE(sim = avacha$sim, obs = avacha$obs),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1         3.35      40.9      NaN
#> 2 hydroGOF    3.33   3.46      1          1        NaN

# KGE
bench::mark(
  tidyhydro = tidyhydro::kge_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::KGE(sim = avacha$sim, obs = avacha$obs, method = "2009"),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1         9.38       1        NaN
#> 2 hydroGOF    9.95   9.99      1         30.0      NaN

# KGE'
bench::mark(
  tidyhydro = tidyhydro::kge2012_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::KGE(sim = avacha$sim, obs = avacha$obs, method = "2012"),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1         18.1      1         NaN
#> 2 hydroGOF    8.05   8.05       1        8.92      Inf

# pBIAS
bench::mark(
  tidyhydro = tidyhydro::pbias_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::pbias(sim = avacha$sim, obs = avacha$obs, dec = 9),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1         2.54      1         NaN
#> 2 hydroGOF    2.54   2.55      1         5.24      NaN

# MSE
bench::mark(
  tidyhydro = tidyhydro::mse_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::mse(sim = avacha$sim, obs = avacha$obs),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 2 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1         3.04      1         NaN
#> 2 hydroGOF    3.12   3.09      1         5.97      NaN

# RMSE
bench::mark(
  tidyhydro = tidyhydro::rmse_vec(truth = avacha$obs, estimate = avacha$sim),
  hydroGOF = hydroGOF::rmse(sim = avacha$sim, obs = avacha$obs),
  yardstick = yardstick::rmse_vec(truth = avacha$obs, estimate = avacha$sim),
  relative = TRUE,
  check = TRUE,
  iterations = 25L,
  filter_gc = FALSE
)
#> # A tibble: 3 × 6
#>   expression   min median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <dbl>  <dbl>     <dbl>     <dbl>    <dbl>
#> 1 tidyhydro   1      1        12.0       1         NaN
#> 2 hydroGOF    3.07   2.98      4.33      9.14      NaN
#> 3 yardstick   3.19   3.00      1        10.9       Inf

Machine specs

system("lscpu | grep -v '^Flags'")
system("lsmem")