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