use std::collections::HashMap;
use std::sync::RwLock;
use std::time::Instant;
fn main() {
println!("═══════════════════════════════════════════════════════════════");
println!(" RwLock Overhead Test");
println!("═══════════════════════════════════════════════════════════════\n");
{
let cache = RwLock::new(HashMap::<i64, Vec<i64>>::new());
{
let mut c = cache.write().unwrap();
c.insert(1, (2..=21).collect::<Vec<i64>>());
}
let start = Instant::now();
for _ in 0..10000 {
let c = cache.read().unwrap();
let _ = c.get(&1).cloned();
}
let elapsed = start.elapsed();
let avg_ns = elapsed.as_nanos() / 10000;
println!("Direct RwLock<HashMap>: avg {} ns/query", avg_ns);
}
{
let inner = RwLock::new(HashMap::<i64, Vec<i64>>::new());
let outer = RwLock::new(inner);
{
let inner_lock = outer.write().unwrap();
let mut map = inner_lock.write().unwrap();
map.insert(1, (2..=21).collect::<Vec<i64>>());
}
let start = Instant::now();
for _ in 0..10000 {
let inner_lock = outer.read().unwrap(); let map = inner_lock.read().unwrap(); let _ = map.get(&1).cloned();
}
let elapsed = start.elapsed();
let avg_ns = elapsed.as_nanos() / 10000;
println!("Nested RwLock (read+read): avg {} ns/query", avg_ns);
}
{
use parking_lot::RwLock as ParkingLotRwLock;
let cache = ParkingLotRwLock::new(HashMap::<i64, Vec<i64>>::new());
{
let mut c = cache.write();
c.insert(1, (2..=21).collect::<Vec<i64>>());
}
let start = Instant::now();
for _ in 0..10000 {
let c = cache.read();
let _ = c.get(&1).cloned();
}
let elapsed = start.elapsed();
let avg_ns = elapsed.as_nanos() / 10000;
println!("ParkingLot RwLock<HashMap>: avg {} ns/query", avg_ns);
}
println!("\n═══════════════════════════════════════════════════════════════");
}