surrealpatch/lib/benches/executor.rs
2023-07-05 21:26:13 +00:00

65 lines
2 KiB
Rust

use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
use pprof::criterion::{Output, PProfProfiler};
use surrealdb::{dbs::Session, kvs::Datastore};
macro_rules! query {
($c: expr, $name: ident, $query: expr) => {
query!($c, $name, "", $query);
};
($c: expr, $name: ident, $setup: expr, $query: expr) => {
$c.bench_function(stringify!($name), |b| {
let (dbs, ses) = futures::executor::block_on(async {
let dbs = Datastore::new("memory").await.unwrap();
let ses = Session::for_kv().with_ns("test").with_db("test");
let setup = $setup;
if !setup.is_empty() {
dbs.execute(setup, &ses, None).await.unwrap();
}
(dbs, ses)
});
b.iter(|| {
futures::executor::block_on(async {
black_box(dbs.execute(black_box($query), &ses, None).await).unwrap();
});
})
});
};
}
fn bench_executor(c: &mut Criterion) {
let mut c = c.benchmark_group("executor");
c.throughput(Throughput::Elements(1));
query!(c, create_delete_simple, "CREATE person:one; DELETE person:one;");
query!(c, select_simple_one, "CREATE person:tobie;", "SELECT * FROM person;");
query!(c, select_simple_five, "CREATE person:one; CREATE person:two; CREATE person:three; CREATE person:four; CREATE person:five;", "SELECT * FROM person;");
query!(c, select_future, "SELECT * FROM <future>{5};");
query!(
c,
update_simple,
"CREATE thing:one SET value = 0;",
"UPDATE thing SET value = value + 1;"
);
query!(
c,
select_record_link,
"CREATE person:one SET friend = person:two; CREATE person:two SET age = 30;",
"SELECT * FROM person:one.friend.age;"
);
#[cfg(feature = "scripting")]
query!(c, javascript_simple, "RETURN function() { return 1 + 1; };");
#[cfg(feature = "scripting")]
query!(
c,
javascript_function,
"RETURN function() { return surrealdb::functions::count([1, 2, 3]); };"
);
c.finish();
}
criterion_group!(
name = benches;
config = Criterion::default().with_profiler(PProfProfiler::new(1000, Output::Flamegraph(None)));
targets = bench_executor
);
criterion_main!(benches);