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.9ms   47.7ms      20.8   16.17MB     8.93
#> 2 slope_terra    43.7ms   45.7ms      22.0    1.96MB    11.0

That is approximately

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

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    46.7ms   46.9ms      21.1    5.28MB    16.9 
#> 2 bilinear2    45.5ms   46.3ms      21.1    1.86MB     5.28
#> 3 simple1      38.2ms   39.4ms      25.5    1.97MB     8.49
#> 4 simple2        39ms   39.7ms      25.1    1.91MB     4.56
round(res$`itr/sec` * nrow(r))
#> [1] 5729 5727 6900 6804