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   46.4ms      21.2   16.26MB     9.10
#> 2 slope_terra    44.2ms     45ms      17.0    1.96MB     6.79

That is approximately

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

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    45.9ms   46.1ms      21.6    5.29MB    12.3 
#> 2 bilinear2    44.6ms   45.2ms      22.2    1.86MB     4.93
#> 3 simple1      37.6ms   38.1ms      26.1    1.97MB    11.6 
#> 4 simple2      39.6ms   40.1ms      24.9    1.98MB     7.47
round(res$`itr/sec` * nrow(r))
#> [1] 5843 6007 7073 6744