use std::time::{Duration, Instant};
use macrame::prelude::*;
use macrame::BranchId;
const T0: &str = "2026-01-01T00:00:00.000000Z";
const FOREVER: &str = "9999-12-31T23:59:59.999999Z";
const NODES: usize = 400;
const ROUNDS: usize = 40;
async fn best_of<F, Fut, T>(rounds: usize, mut f: F) -> Duration
where
F: FnMut() -> Fut,
Fut: std::future::Future<Output = T>,
{
let mut best = Duration::MAX;
for _ in 0..rounds {
let t = Instant::now();
let out = f().await;
best = best.min(t.elapsed());
std::hint::black_box(out);
}
best
}
fn id(n: &str) -> BranchId {
BranchId::new(n).unwrap()
}
async fn seeded(dir: &std::path::Path, depth: usize) -> Database {
let db = Database::open(dir.join(format!("d{depth}.db")))
.await
.unwrap();
let names: Vec<String> = (0..NODES).map(|i| format!("n{i:04}")).collect();
db.write_concepts(
names
.iter()
.map(|n| ConceptUpsert::new(n.as_str(), "t").valid_from(T0))
.collect(),
)
.await
.unwrap();
db.bulk_import(
names
.windows(2)
.map(|w| {
EdgeAssertion::new(w[0].as_str(), w[1].as_str(), "CITES")
.valid_from(T0)
.valid_to(FOREVER)
})
.collect(),
)
.await
.unwrap();
let mut parent = BranchId::main();
for i in 1..=depth {
let child = id(&format!("b{i}"));
db.fork(child.clone(), parent).await.unwrap();
parent = child;
}
db.bulk_import(
names
.windows(3)
.step_by(7)
.map(|w| {
EdgeAssertion::new(w[0].as_str(), w[2].as_str(), "CITES")
.valid_from(T0)
.valid_to(FOREVER)
})
.collect(),
)
.await
.unwrap();
db
}
fn line(label: &str, d: Duration, rows: usize) {
println!(
" {label:<44} {:>9.1} µs {rows} rows",
d.as_secs_f64() * 1e6
);
}
#[tokio::main]
async fn main() {
let dir = std::env::temp_dir().join(format!("macrame_read_probe_{}", std::process::id()));
std::fs::create_dir_all(&dir).unwrap();
println!(
"resolved_read_probe — crate {}\n{} concepts, best of {ROUNDS}\n",
env!("CARGO_PKG_VERSION"),
NODES
);
for depth in [1_usize, 8] {
let db = seeded(&dir, depth).await;
let leaf = format!("b{depth}");
println!("fork depth {depth} (reading `{leaf}`)");
let plan = ReadPlan::new().on(id(&leaf)).valid_at(T0);
let rows = db.edges(plan.clone()).await.unwrap().len();
let t = best_of(ROUNDS, || {
let p = plan.clone();
async { db.edges(p).await.unwrap() }
})
.await;
line("edges(plan), current belief", t, rows);
let folded = ReadPlan::new()
.on(id(&leaf))
.valid_at(T0)
.recorded_at(FOREVER);
let rows = db.edges(folded.clone()).await.unwrap().len();
let t = best_of(ROUNDS, || {
let p = folded.clone();
async { db.edges(p).await.unwrap() }
})
.await;
line("edges(plan), at a recorded instant", t, rows);
let walk = TraversalBuilder::new("n0000")
.max_depth(6)
.on_branch(id(&leaf));
let rows = walk.execute_ids(db.read_conn(), T0).await.unwrap().len();
let t = best_of(ROUNDS, || async {
walk.clone().execute_ids(db.read_conn(), T0).await.unwrap()
})
.await;
line("traverse, depth 6", t, rows);
let trunk = ReadPlan::new().valid_at(T0);
let rows = db.edges(trunk.clone()).await.unwrap().len();
let t = best_of(ROUNDS, || {
let p = trunk.clone();
async { db.edges(p).await.unwrap() }
})
.await;
line("edges(plan) on the trunk [control]", t, rows);
db.close().await.unwrap();
println!();
}
let _ = std::fs::remove_dir_all(&dir);
}