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     44ms   44.7ms      22.0   16.26MB     12.6
#> 2 slope_terra    42.9ms   43.3ms      23.0    1.96MB     15.4

That is approximately

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

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    43.9ms   44.6ms      22.5    5.29MB    12.8 
#> 2 bilinear2    42.5ms   43.1ms      23.1    1.86MB     7.71
#> 3 simple1      35.9ms   36.3ms      27.6    1.97MB     7.51
#> 4 simple2      37.6ms   37.9ms      26.3    1.98MB    11.7
round(res$`itr/sec` * nrow(r))
#> [1] 6086 6272 7467 7116