Skip to content

Instantly share code, notes, and snippets.

@redbug312
Last active August 21, 2022 03:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save redbug312/92991966eb66ecf386b49d0a6d0b4028 to your computer and use it in GitHub Desktop.
Save redbug312/92991966eb66ecf386b49d0a6d0b4028 to your computer and use it in GitHub Desktop.
Compare memory usage in different ID maps
129c129
< for i in 0..32 as usize {
---
> for i in 0..8 as usize {
use std::num::NonZeroUsize;
use std::collections::HashMap;
use deepsize::DeepSizeOf;
use itertools::Itertools;
use rudy::rudymap::RudyMap;
#[derive(DeepSizeOf)]
pub struct HashIdMap {
real_to_virt: HashMap<usize, usize>,
virt_to_real: Vec<usize>,
}
impl HashIdMap {
fn new(nodes: impl Iterator<Item = usize>) -> Self {
let virt_to_real = nodes.collect_vec();
let real_to_virt = virt_to_real
.iter()
.copied()
.enumerate()
.map(|(index, node)| (node, index))
.collect();
Self {
real_to_virt,
virt_to_real,
}
}
}
#[derive(DeepSizeOf)]
pub struct VecIdMap {
real_to_virt: Vec<Option<usize>>,
virt_to_real: Vec<usize>,
}
impl VecIdMap {
fn new(nodes: impl Iterator<Item = usize>) -> Self {
let virt_to_real = nodes.collect_vec();
let max_id = virt_to_real
.iter()
.max()
.copied()
.unwrap_or(0);
let mut real_to_virt = vec![None; max_id + 1];
virt_to_real
.iter()
.enumerate()
.for_each(|(index, node)| real_to_virt[*node] = Some(index));
Self {
real_to_virt,
virt_to_real,
}
}
}
#[derive(DeepSizeOf)]
pub struct VecNonZeroIdMap {
real_to_virt: Vec<Option<NonZeroUsize>>,
virt_to_real: Vec<usize>,
}
impl VecNonZeroIdMap {
fn new(nodes: impl Iterator<Item = usize>) -> Self {
let virt_to_real = nodes.collect_vec();
let max_id = virt_to_real
.iter()
.max()
.copied()
.unwrap_or(0);
let mut real_to_virt = vec![None; max_id + 1];
virt_to_real
.iter()
.enumerate()
.for_each(|(index, node)| real_to_virt[*node] = NonZeroUsize::new(index + 1));
Self {
real_to_virt,
virt_to_real,
}
}
}
pub struct RudyIdMap {
real_to_virt: RudyMap<usize, usize>,
virt_to_real: Vec<usize>,
}
impl RudyIdMap {
fn new(nodes: impl Iterator<Item = usize>) -> Self {
let virt_to_real = nodes.collect_vec();
let mut real_to_virt = RudyMap::new();
let success = virt_to_real
.iter()
.enumerate()
.map(|(index, node)| real_to_virt.insert(*node, index))
.all(|duplicated| duplicated.is_none());
assert!(success);
Self {
real_to_virt,
virt_to_real,
}
}
fn deep_size_of(self) -> usize {
self.real_to_virt.memory_usage() + self.virt_to_real.deep_size_of()
}
}
fn main() {
let range = 500..1000;
let map = HashIdMap::new(range.clone());
println!("{:?}", map.deep_size_of());
let map = VecIdMap::new(range.clone());
println!("{:?}", map.deep_size_of());
let map = VecNonZeroIdMap::new(range.clone());
println!("{:?}", map.deep_size_of());
let map = RudyIdMap::new(range.clone());
println!("{:?}", map.deep_size_of());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment