use std::thread; use countme::{get, Count}; #[derive(Default)] struct Foo { _c: Count, } #[derive(Default)] struct Bar { _c: Count, _x: i32, } mod deeply { pub(crate) mod nested { pub(crate) mod module { use countme::Count; #[derive(Default)] pub(crate) struct Quux { _c: Count, } } } } fn main() { countme::enable(true); let t = std::time::Instant::now(); let n = 5; let m = 1_000_000; let mut threads = Vec::new(); for _ in 0..n { threads.push(thread::spawn(move || { for _ in 0..m { Foo::default(); } })); threads.push(thread::spawn(move || { let mut xs = Vec::with_capacity(m); for _ in 0..m { xs.push(Bar::default()) } })); threads.push(thread::spawn(move || { for _ in 0..m { deeply::nested::module::Quux::default(); } })); } for t in threads { t.join().unwrap(); } let foo = get::(); assert_eq!(foo.total, m * n); assert!(foo.max_live >= 1); assert_eq!(foo.live, 0); let bar = get::(); assert_eq!(bar.total, m * n); assert!(bar.max_live >= m); assert_eq!(bar.live, 0); println!("{:?}", t.elapsed()); }