Benchmarking slopes calculation

library(slopes)
library(bench)
library(raster)
#> Loading required package: sp

Performance

A benchmark can reveal how many route gradients can be calculated per second:

e = dem_lisbon_raster
r = lisbon_road_network
et = terra::rast(e)
res = bench::mark(check = FALSE,
  slope_raster = slope_raster(r, e),
  slope_terra = slope_raster(r, et)
)
res
#> # A tibble: 2 × 6
#>   expression        min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr>   <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 slope_raster   46.8ms   48.9ms      20.0   21.56MB     4.99
#> 2 slope_terra    44.6ms   46.1ms      17.2    1.82MB     4.91

That is approximately

round(res$`itr/sec` * nrow(r))
#> [1] 5409 4656

routes per second using the raster and terra (the default if installed, using RasterLayer and native SpatRaster objects) packages to extract elevation estimates from the raster datasets, respectively.

The message: use the terra package to read-in DEM data for slope extraction if speed is important.

To go faster, you can chose the simple method to gain some speed at the expense of accuracy:

e = dem_lisbon_raster
r = lisbon_road_network
res = bench::mark(check = FALSE,
  bilinear1 = slope_raster(r, e),
  bilinear2 = slope_raster(r, et),
  simple1 = slope_raster(r, e, method = "simple"),
  simple2 = slope_raster(r, et, method = "simple")
)
res
#> # A tibble: 4 × 6
#>   expression      min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 bilinear1    47.2ms   48.4ms      20.7    5.15MB     8.89
#> 2 bilinear2    45.2ms   45.9ms      21.4    1.73MB     4.77
#> 3 simple1        38ms   38.7ms      25.9    1.84MB     4.71
#> 4 simple2      39.7ms   40.3ms      24.8    1.84MB     4.96
round(res$`itr/sec` * nrow(r))
#> [1] 5618 5812 7018 6725