use std::sync::Arc;
use graphrefly_core::{
BindingBoundary, Core, DepBatch, FnId, FnResult, HandleId, Message, NodeId, Sink,
};
struct ProfBinding;
impl BindingBoundary for ProfBinding {
fn invoke_fn(&self, _: NodeId, _: FnId, _: &[DepBatch]) -> FnResult {
FnResult::Data {
handle: HandleId::new(1),
tracked: None,
}
}
fn custom_equals(&self, _: FnId, a: HandleId, b: HandleId) -> bool {
a == b
}
fn release_handle(&self, _: HandleId) {}
}
fn noop_sink() -> Sink {
Arc::new(|_: &[Message]| {})
}
fn main() {
let emits: u64 = std::env::args()
.nth(1)
.and_then(|s| s.parse().ok())
.unwrap_or(60_000_000);
let binding: Arc<dyn BindingBoundary> = Arc::new(ProfBinding);
let core = Core::new(binding);
let s = core.register_state(HandleId::new(1), false).unwrap();
let sub = core.subscribe(s, noop_sink());
let same = HandleId::new(1);
let start = std::time::Instant::now();
for _ in 0..emits {
core.emit(std::hint::black_box(s), std::hint::black_box(same));
}
let dt = start.elapsed();
eprintln!(
"profile_st_emit: {emits} emits in {dt:?} = {:.1} ns/emit (real single-owner Core dedup)",
dt.as_nanos() as f64 / emits as f64
);
core.unsubscribe(s, sub);
}