Skip to content

Commit

Permalink
Add accumulator benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaReiser committed Dec 3, 2024
1 parent b7331d9 commit 297dd2b
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ edition = "2021"
license = "Apache-2.0 OR MIT"
repository = "https://github.com/salsa-rs/salsa"
description = "A generic framework for on-demand, incrementalized computation (experimental)"
rust-version = "1.76"

[dependencies]
arc-swap = "1"
Expand Down Expand Up @@ -44,5 +45,9 @@ harness = false
name = "incremental"
harness = false

[[bench]]
name = "accumulator"
harness = false

[workspace]
members = ["components/salsa-macro-rules", "components/salsa-macros"]
64 changes: 64 additions & 0 deletions benches/accumulator.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
use codspeed_criterion_compat::{criterion_group, criterion_main, BatchSize, Criterion};
use salsa::Accumulator;

#[salsa::input]
struct Input {
expressions: usize,
}

#[allow(dead_code)]
#[salsa::accumulator]
struct Diagnostic(String);

#[salsa::interned]
struct Expression<'db> {
number: usize,
}

#[salsa::tracked]
fn root<'db>(db: &'db dyn salsa::Database, input: Input) -> Vec<usize> {
(0..input.expressions(db))
.map(|i| infer_expression(db, Expression::new(db, i)))
.collect()
}

#[salsa::tracked]
fn infer_expression<'db>(db: &'db dyn salsa::Database, expression: Expression<'db>) -> usize {
let number = expression.number(db);

if number % 10 == 0 {
Diagnostic(format!("Number is {number}")).accumulate(db);
}

if number != 0 && number % 2 == 0 {
let sub_expression = Expression::new(db, number / 2);
let _ = infer_expression(db, sub_expression);
}

number
}

fn accumulator(criterion: &mut Criterion) {
criterion.bench_function("accumulator", |b| {
b.iter_batched_ref(
|| {
let db = salsa::DatabaseImpl::new();
let input = Input::new(&db, 10_000);
// Pre-warm
let _ = root(&db, input);
(db, input)
},
|(db, input)| {
// Measure the cost of collecting accumulators ignoring the cost of running the
// query itself.
let diagnostics = root::accumulated::<Diagnostic>(db, *input);

assert_eq!(diagnostics.len(), 1000);
},
BatchSize::SmallInput,
);
});
}

criterion_group!(benches, accumulator);
criterion_main!(benches);

0 comments on commit 297dd2b

Please sign in to comment.