use std::time::Instant;
use std::sync::Arc;
use parking_lot::RwLock;
use std::collections::HashMap;
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!("═══════════════════════════════════════════════════════════════════");
}