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.7ms   47.3ms      20.2   16.24MB     8.66
#> 2 slope_terra    45.3ms     46ms      21.9    1.96MB    14.6

That is approximately

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

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.4ms   47.4ms      21.1    5.28MB     7.92
#> 2 bilinear2    44.9ms   45.7ms      21.7    1.86MB     8.13
#> 3 simple1      38.4ms     39ms      25.6    1.97MB    11.4 
#> 4 simple2      40.2ms   40.9ms      24.4    1.98MB     8.12
round(res$`itr/sec` * nrow(r))
#> [1] 5727 5875 6938 6605