diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2023-01-11 23:37:46 +0100 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2023-01-11 23:37:46 +0100 | 
| commit | 3826d00f339e87698f95dc24c33739e2880aac65 (patch) | |
| tree | cc713233330efda0240299a5c72ef2d292b83272 /src | |
| parent | 42cd7c82745e19234a6350e326064baf2454c717 (diff) | |
| download | hittekaart-3826d00f339e87698f95dc24c33739e2880aac65.tar.gz hittekaart-3826d00f339e87698f95dc24c33739e2880aac65.tar.bz2 hittekaart-3826d00f339e87698f95dc24c33739e2880aac65.zip  | |
add some first benchmarks
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/main.rs | 13 | ||||
| -rw-r--r-- | src/renderer.rs | 28 | 
3 files changed, 31 insertions, 14 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..06f8f31 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +//! This is a stub library for `hittekaart` to expose the functions for benchmarking. +pub mod gpx; +pub mod layer; +pub mod renderer; diff --git a/src/main.rs b/src/main.rs index b5bbdb3..e066a95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@  use std::{env, fs, path::PathBuf};  use color_eyre::eyre::Result; +use indicatif::ProgressBar;  mod gpx;  mod layer; @@ -21,10 +22,18 @@ fn main() -> Result<()> {      for zoom in 0..=19 {          println!("Doing level {zoom}"); -        let counter = renderer::render_heatcounter(zoom, &tracks); + +        let bar = ProgressBar::new(tracks.len().try_into().unwrap()); +        let counter = +            renderer::render_heatcounter(zoom, &tracks, |x| bar.inc(x.try_into().unwrap())); +        bar.finish(); +          let target = ["tiles", &zoom.to_string()].iter().collect::<PathBuf>();          fs::create_dir(&target)?; -        renderer::lazy_colorization(&counter, &target)?; + +        let bar = ProgressBar::new(counter.tile_count().try_into().unwrap()); +        renderer::lazy_colorization(&counter, &target, |x| bar.inc(x.try_into().unwrap()))?; +        bar.finish();      }      Ok(()) diff --git a/src/renderer.rs b/src/renderer.rs index 1346ed1..6e17304 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -2,7 +2,6 @@ use std::{fs, mem, path::Path};  use color_eyre::eyre::{bail, Result};  use image::{ImageBuffer, Luma, Pixel, Rgba, RgbaImage}; -use indicatif::ProgressBar;  use nalgebra::{vector, Vector2};  use num_traits::identities::Zero; @@ -21,7 +20,10 @@ fn render_circle<P: Pixel>(layer: &mut TileLayer<P>, center: (u64, u64), radius:      let mut circle = ImageBuffer::<P, Vec<P::Subpixel>>::new(rad_32 * 2 + 1, rad_32 * 2 + 1);      imageproc::drawing::draw_filled_circle_mut(          &mut circle, -        (i32::try_from(radius).unwrap(), i32::try_from(radius).unwrap()), +        ( +            i32::try_from(radius).unwrap(), +            i32::try_from(radius).unwrap(), +        ),          radius.try_into().unwrap(),          pixel,      ); @@ -145,15 +147,17 @@ pub fn colorize_heatcounter(layer: &HeatCounter) -> HeatMap {  /// rendering the next one.  ///  /// This has a way lower memory usage than [`colorize_heatcounter`]. -pub fn lazy_colorization<P: AsRef<Path>>(layer: &HeatCounter, base_dir: P) -> Result<()> { +pub fn lazy_colorization<P: AsRef<Path>, F: FnMut(usize)>( +    layer: &HeatCounter, +    base_dir: P, +    mut progress_callback: F, +) -> Result<()> {      let base_dir = base_dir.as_ref();      let max = layer.pixels().map(|l| l.0[0]).max().unwrap_or_default();      if max == 0 {          return Ok(());      } -    let bar = ProgressBar::new(layer.tile_count().try_into().unwrap()); -      for (tile_x, tile_y, tile) in layer.enumerate_tiles() {          let colorized = colorize_tile(&tile, max.into());          let folder = base_dir.join(&tile_x.to_string()); @@ -165,18 +169,19 @@ pub fn lazy_colorization<P: AsRef<Path>>(layer: &HeatCounter, base_dir: P) -> Re          }          let file = folder.join(&format!("{tile_y}.png"));          layer::compress_png(&colorized, file)?; -        bar.inc(1); +        progress_callback(1);      } -    bar.finish();      Ok(())  }  /// Renders the heat counter for the given zoom level and track points. -pub fn render_heatcounter(zoom: u32, tracks: &[Vec<Coordinates>]) -> HeatCounter { +pub fn render_heatcounter<F: FnMut(usize)>( +    zoom: u32, +    tracks: &[Vec<Coordinates>], +    mut progress_callback: F, +) -> HeatCounter {      let size = 256 * 2u64.pow(zoom); -    let bar = ProgressBar::new(tracks.len().try_into().unwrap()); -      let mut heatcounter = TileLayer::from_pixel(size, size, [0].into());      for track in tracks { @@ -196,8 +201,7 @@ pub fn render_heatcounter(zoom: u32, tracks: &[Vec<Coordinates>]) -> HeatCounter          }          merge_heat_counter(&mut heatcounter, &layer); -        bar.inc(1); +        progress_callback(1);      } -    bar.finish();      heatcounter  }  | 
