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   44.8ms   45.1ms      22.0   19.66MB     18.3
#> 2 slope_terra      42ms   42.5ms      23.5    1.94MB     15.7

That is approximately

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

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.7ms   46.4ms      21.5    5.28MB    21.5 
#> 2 bilinear2    44.4ms   45.8ms      21.7    1.86MB     9.30
#> 3 simple1      37.4ms   37.7ms      25.7    1.97MB    18.4 
#> 4 simple2      37.2ms   38.7ms      24.8    1.98MB     2.25
round(res$`itr/sec` * nrow(r))
#> [1] 5817 5880 6971 6713