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   45.1ms   45.3ms      21.0   16.24MB     7.87
#> 2 slope_terra    43.1ms   43.4ms      23.0    1.96MB    11.5

That is approximately

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

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    44.5ms   45.5ms      21.8    5.28MB     8.19
#> 2 bilinear2    43.6ms     44ms      22.6    1.86MB     8.48
#> 3 simple1      36.7ms   36.9ms      26.8    1.97MB    11.9 
#> 4 simple2      38.4ms   38.7ms      25.7    1.98MB     7.72
round(res$`itr/sec` * nrow(r))
#> [1] 5918 6131 7257 6969