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   43.8ms   44.8ms      21.3   16.16MB    12.2 
#> 2 slope_terra    42.4ms   42.8ms      20.0    1.96MB     5.00

That is approximately

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

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.6ms   44.9ms      21.8    5.28MB    18.2 
#> 2 bilinear2    41.8ms   42.9ms      23.2    1.86MB     5.16
#> 3 simple1      35.8ms   36.6ms      27.3    1.97MB     8.19
#> 4 simple2      36.2ms   36.6ms      27.2    1.98MB     8.15
round(res$`itr/sec` * nrow(r))
#> [1] 5912 6298 7400 7362