diff options
author | tcmal <tcmal> | 2023-06-04 21:15:47 +0000 |
---|---|---|
committer | Aria <me@aria.rip> | 2023-10-01 17:31:30 +0100 |
commit | a205548dac7c5639115d1dec1441af693d549f5a (patch) | |
tree | 357b883c92d35c37b905d1e5395d046218d96700 /incria/benches | |
parent | 3a187fedcad7e63a564bb601f2d70354bb66faaa (diff) |
start spreadsheet benchmarks
Diffstat (limited to 'incria/benches')
-rw-r--r-- | incria/benches/spreadsheet.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/incria/benches/spreadsheet.rs b/incria/benches/spreadsheet.rs new file mode 100644 index 0000000..ada4b22 --- /dev/null +++ b/incria/benches/spreadsheet.rs @@ -0,0 +1,71 @@ +use std::{future::Future, pin::Pin, sync::OnceLock}; + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use incria::{ + deps, + thunk::{Thunk, ThunkMapper}, + Mapper, +}; + +type Key = (usize, usize); +type Value = usize; + +#[derive(Debug, Default)] +struct CellThunk; + +impl Thunk<Key, Value> for CellThunk { + fn compute(&self, key: Key) -> Pin<Box<dyn Future<Output = Value> + Send + '_>> { + Box::pin(async move { + if key.0 > 0 { + let prev1 = *cell_mapping().get(&(key.0 - 1, key.1 - 1)).await; + let prev2 = *cell_mapping().get(&(key.0 - 1, key.1)).await; + let prev3 = *cell_mapping().get(&(key.0 - 1, key.1 + 1)).await; + let val = prev1 + prev2 + prev3; + + if val > 10_000 { + 1 + } else { + val + } + } else { + 1 + } + }) + } +} + +fn calc_raw(key: Key) -> Value { + if key.0 > 0 { + let prev1 = calc_raw((key.0 - 1, key.1 - 1)); + let prev2 = calc_raw((key.0 - 1, key.1)); + let prev3 = calc_raw((key.0 - 1, key.1 + 1)); + let val = prev1 + prev2 + prev3; + + if val > 10_000 { + 1 + } else { + val + } + } else { + 1 + } +} + +type CellMapping = ThunkMapper<Key, Value, CellThunk>; +static CELL_MAPPING: OnceLock<CellMapping> = OnceLock::new(); +fn cell_mapping() -> &'static CellMapping { + CELL_MAPPING.get_or_init(CellMapping::default) +} + +fn criterion_benchmark(c: &mut Criterion) { + c.bench_function("spreadsheet non-incria (n = 5)", |b| { + b.iter(|| calc_raw(black_box((5, 5)))); + }); + c.bench_function("spreadsheet fresh (n = 5)", |b| { + b.to_async(tokio::runtime::Runtime::new().unwrap()) + .iter(|| deps::with_node_id(deps::next_node_id(), cell_mapping().get(&(5, 5)))); + }); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); |