use parking_lot::RwLock;
use std::collections::HashMap;
use std::sync::Arc;
use std::time::Instant;
fn main() {
println!("═══════════════════════════════════════════════════════════════════");
println!(" Direct V3EdgeStore Cache Performance (Simulated)");
println!("═══════════════════════════════════════════════════════════════════\n");
{
let cache: HashMap<(i64, u8), Arc<[i64]>> = [(
(1, 0),
Arc::from((2..=21).collect::<Vec<i64>>().into_boxed_slice()),
)]
.into_iter()
.collect();
let start = Instant::now();
for _ in 0..100000 {
if let Some(neighbors) = cache.get(&(1, 0)) {
let _ = neighbors.clone(); }
}
let avg_ns = start.elapsed().as_nanos() / 100000;
println!(
"1. Raw HashMap (no lock): {:>6} ns/query (baseline)",
avg_ns
);
}
{
let cache = RwLock::new(HashMap::<(i64, u8), Arc<[i64]>>::from([(
(1, 0),
Arc::from((2..=21).collect::<Vec<i64>>().into_boxed_slice()),
)]));
for _ in 0..1000 {
let c = cache.read();
if let Some(n) = c.get(&(1, 0)) {
let _ = n.clone();
}
}
let start = Instant::now();
for _ in 0..100000 {
let c = cache.read(); if let Some(neighbors) = c.get(&(1, 0)) {
let _ = neighbors.clone(); }
}
let avg_ns = start.elapsed().as_nanos() / 100000;
println!(
"2. RwLock<HashMap> (hot): {:>6} ns/query (V3EdgeStore cache)",
avg_ns
);
}
{
let inner = RwLock::new(HashMap::<(i64, u8), Arc<[i64]>>::from([(
(1, 0),
Arc::from((2..=21).collect::<Vec<i64>>().into_boxed_slice()),
)]));
let outer = RwLock::new(inner);
for _ in 0..1000 {
let store = outer.read();
let c = store.read();
if let Some(n) = c.get(&(1, 0)) {
let _ = n.clone();
}
}
let start = Instant::now();
for _ in 0..100000 {
let store = outer.read(); let c = store.read(); if let Some(neighbors) = c.get(&(1, 0)) {
let _ = neighbors.clone(); }
}
let avg_ns = start.elapsed().as_nanos() / 100000;
println!(
"3. RwLock<RwLock<HashMap>>: {:>6} ns/query (V3Backend full path)",
avg_ns
);
}
{
let cache = RwLock::new(HashMap::<(i64, u8), Vec<i64>>::from([(
(1, 0),
(2..=21).collect::<Vec<i64>>(),
)]));
let start = Instant::now();
for _ in 0..100000 {
let c = cache.read();
if let Some(neighbors) = c.get(&(1, 0)) {
let _ = neighbors.clone(); }
}
let avg_ns = start.elapsed().as_nanos() / 100000;
println!(
"4. Vec::clone (old way): {:>6} ns/query (alloc + copy)",
avg_ns
);
}
println!("\n═══════════════════════════════════════════════════════════════════");
println!(" INTERPRETATION");
println!("═══════════════════════════════════════════════════════════════════");
println!(" • Raw HashMap: Baseline - memory read speed");
println!(" • Single RwLock: + parking_lot overhead (~20-30ns)");
println!(" • Double RwLock: + second lock acquisition (~50-100ns)");
println!(" • Arc::clone: Single atomic increment (~2-5ns)");
println!(" • Vec::clone: Heap alloc + memcpy of all elements");
println!("");
println!(" The '70× faster' in benchmark report assumes:");
println!(" - Cache is HOT (no B+tree lookup)");
println!(" - Using Arc<[i64]> (not Vec<i64>)");
println!(" - Minimal lock contention");
println!("═══════════════════════════════════════════════════════════════════");
}