Operator statistics (#144)

This commit is contained in:
Alex Ozdemir
2023-01-29 19:39:02 -08:00
committed by GitHub
parent 63f950a795
commit e4d19b358a
11 changed files with 71 additions and 0 deletions

View File

@@ -49,6 +49,10 @@ impl crate::Table<u8> for Table {
"hashconsing"
}
fn for_each(f: impl FnMut(&u8, &[Self::Node])) {
panic!()
}
fn reserve(num_nodes: usize) {
FACTORY.reserve(num_nodes);
}

View File

@@ -52,6 +52,10 @@ macro_rules! generate_hashcons_hashconsing {
"hashconsing"
}
fn for_each(f: impl FnMut(&$Op, &[Self::Node])) {
panic!()
}
fn reserve(num_nodes: usize) {
FACTORY.reserve(num_nodes);
}

View File

@@ -50,6 +50,10 @@ impl crate::Table<TemplateOp> for Table {
"hashconsing"
}
fn for_each(f: impl FnMut(&TemplateOp, &[Self::Node])) {
panic!()
}
fn reserve(num_nodes: usize) {
FACTORY.reserve(num_nodes);
}

View File

@@ -39,6 +39,9 @@ pub trait Table<Op> {
/// The name of the implementation
fn name() -> &'static str;
/// Fun a function on every node
fn for_each(f: impl FnMut(&Op, &[Self::Node]));
/// When the table garbage-collects a node with ID `id`, it will call `f(id)`. `f(id)` might
/// clear caches, etc., but instead of droping `Node`s, it should return them.
///

View File

@@ -45,6 +45,10 @@ impl crate::Table<u8> for Table {
"raw"
}
fn for_each(mut f: impl FnMut(&u8, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -48,6 +48,10 @@ macro_rules! generate_hashcons_raw {
"raw"
}
fn for_each(mut f: impl FnMut(&$Op, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -45,6 +45,10 @@ impl crate::Table<TemplateOp> for Table {
"raw"
}
fn for_each(mut f: impl FnMut(&TemplateOp, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -69,6 +69,10 @@ impl crate::Table<u8> for Table {
"rc"
}
fn for_each(mut f: impl FnMut(&u8, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -72,6 +72,10 @@ macro_rules! generate_hashcons_rc {
"rc"
}
fn for_each(mut f: impl FnMut(&$Op, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -69,6 +69,10 @@ impl crate::Table<TemplateOp> for Table {
"rc"
}
fn for_each(mut f: impl FnMut(&TemplateOp, &[Self::Node])) {
MANAGER.with(|man| man.table.borrow().keys().for_each(|n| f(&n.op, &n.cs)));
}
fn reserve(num_nodes: usize) {
MANAGER.with(|man| man.table.borrow_mut().reserve(num_nodes))
}

View File

@@ -161,3 +161,35 @@ pub fn array_elements(t: &Term) -> Vec<Term> {
pub fn array_to_tuple(t: &Term) -> Term {
term(Op::Tuple, array_elements(t))
}
/// Print operator stats
pub fn dump_op_stats() {
use std::mem::size_of;
println!("Op size: {}bytes", size_of::<Op>());
let mut counts: FxHashMap<Op, usize> = FxHashMap::default();
let mut children: FxHashMap<Op, usize> = FxHashMap::default();
let add = |map: &mut FxHashMap<Op, usize>, key: &Op, value: usize| {
if let Some(present_value) = map.get_mut(key) {
*present_value += value;
} else {
map.insert(key.clone(), value);
}
};
hc::Table::for_each(|op, cs| {
add(&mut counts, op, 1);
add(&mut children, op, cs.len());
});
let mut vector = Vec::new();
for k in counts.keys() {
let ct = *counts.get(k).unwrap();
let cs_ct = *children.get(k).unwrap();
let ave = cs_ct as f64 / ct as f64;
vector.push((k.clone(), ct, cs_ct, ave));
}
vector.sort_by_key(|t| t.1);
for (k, ct, cs_ct, ave) in vector {
let mem = size_of::<Op>() * ct + size_of::<Vec<Term>>() * ct + size_of::<Term>() * cs_ct;
let s: String = format!("{k}");
println!("Op {s:>20}, Count {ct:>8}, Children {cs_ct:>8}, Ave {ave:>8.2}, Mem {mem:>20}");
}
}